Bei dieser Frage geht es nicht um Bytea vs. Oid vs. Blobs vs. große Objekte usw.
Ich habe eine Tabelle, die ein Primärschlüsselfeld integer
und ein bytea
Feld enthält. Ich möchte Daten in das bytea
Feld eingeben . Dies kann vermutlich in einer der PL/
Sprachen geschehen , und ich werde dies möglicherweise in PL/Python
Zukunft prüfen.
Da ich noch teste und experimentiere, möchte ich einfach Daten aus einer Datei (auf dem Server) mithilfe von "Standard" -SQL-Anweisungen einfügen. Mir ist bekannt, dass nur Administratoren mit Schreibberechtigung auf dem Server Daten in der von mir gewünschten Weise einfügen können. Ich mache mir diesbezüglich keine Sorgen, da Benutzer bytea
derzeit keine Daten eingeben würden . Ich habe die verschiedenen StackExchange-Sites, die PostgreSQL-Archive und das Internet allgemein durchsucht, konnte jedoch keine Antwort finden.
Bearbeiten: Diese Diskussion von 2008 impliziert, dass das, was ich tun möchte, nicht möglich ist. Wie werden bytea
Felder dann verwendet?
Edit: Diese ähnliche Frage aus dem Jahr 2005 bleibt unbeantwortet.
Gelöst: Die hier auf der psycopg
Website angegebenen Details bildeten die Grundlage für eine Lösung, die ich in Python geschrieben habe. Es kann auch möglich sein, Binärdaten mit in eine bytea
Spalte einzufügen PL/Python
. Ich weiß nicht, ob dies mit "reinem" SQL möglich ist.
quelle
blob
). Wenn das ein Fehler war, entschuldige ich mich aufrichtig.blob
ist ok, vielleichtdatafile
ist es irrelevant.Antworten:
als Superuser:
lo_get
wurde in 9.4 eingeführt, daher benötigen Sie für ältere Versionen:dann:
quelle
Verwenden Sie
pg_read_file('location_of file')::bytea
.Beispielsweise,
Handbuch
quelle
pg_read_binary_file('/path/to/file')
. Siehe postgresql.org/docs/current/static/functions-admin.htmlDiese Lösung ist in Bezug auf die Laufzeit nicht gerade effizient, aber im Vergleich zur Erstellung eigener Header für trivial einfach
COPY BINARY
. Außerdem werden keine Bibliotheken oder Skriptsprachen außerhalb von Bash benötigt.Konvertieren Sie zunächst die Datei in einen Hexdump, wobei Sie die Größe der Datei verdoppeln.
xxd -p
bringt uns ziemlich nahe, aber es wirft einige nervige Zeilenumbrüche auf, um die wir uns kümmern müssen:Importieren Sie anschließend die Daten in PostgreSQL als sehr großes
text
Feld. Dieser Typ kann bis zu 1 GB pro Feldwert enthalten, daher sollten wir für die meisten Zwecke in Ordnung sein:Da es sich bei unseren Daten um eine unnötig große hexadezimale Zeichenfolge handelt, verwenden wir PostgresQLs
decode
, um sie in einenbytea
Typ umzuwandeln :quelle
tr -d '\n'
arbeitet mit der Ausgabe von xxd, die den binären Inhalt der Eingabe als ASCII-Hexadezimalzeichen (0-9 und af) codiert. xxd gibt auch Zeilenvorschübe in regelmäßigen Abständen aus, um die Ausgabe für den Menschen lesbar zu machen. In diesem Fall möchten wir jedoch, dass sie entfernt werden. Zeilenvorschübe in den Originaldaten werden hexadezimal dargestellt und bleiben davon unberührt.Die Antwort mit xxd ist nett und für kleine Dateien sehr schnell. Unten ist ein Beispielskript, das ich verwende.
quelle
Verwenden Sie die Funktion Postgres COPY BINARY . Dies entspricht weitgehend den externen Tabellen von Oracle .
quelle
bytea
Spalte einfügen ?