Cette question ne concerne pas bytea v. Oid v. Blobs v. Gros objets, etc.
J'ai une table contenant un integer
champ de clé primaire et un bytea
champ. J'aimerais entrer des données sur le bytea
terrain. Cela peut vraisemblablement être fait par l’une des PL/
langues, et j’envisagerai peut-être de le faire PL/Python
dans le futur.
Comme je suis toujours en train de tester et d’expérimenter, je voudrais simplement insérer des données d’un fichier (sur le serveur) en utilisant des instructions SQL "standard". Je suis conscient que seuls les administrateurs ayant des droits en écriture sur le serveur pourraient insérer les données comme je le souhaiterais. Je ne m'inquiète pas de cela à ce stade car les utilisateurs ne seraient pas en train d'insérer des bytea
données pour le moment. J'ai consulté les différents sites StackExchange, les archives PostgreSQL et Internet en général, mais je n'ai pas trouvé de réponse.
Edit: Cette discussion de 2008 implique que ce que je veux faire n'est pas possible. Comment les bytea
champs sont-ils utilisés alors?
Edit: Cette question similaire de 2005 reste sans réponse.
Résolu: Les détails fournis ici sur le psycopg
site Web ont fourni la base d'une solution que j'ai écrite en Python. Il peut également être possible d'insérer des données binaires dans une bytea
colonne à l'aide de PL/Python
. Je ne sais pas si cela est possible en utilisant du SQL "pur".
la source
blob
). Si c'était une erreur, je m'excuse sincèrement.blob
va, peutdatafile
- être que ce n'est pas pertinent.Réponses:
en tant que superutilisateur:
lo_get
a été introduit dans la version 9.4, donc pour les versions plus anciennes, il vous faudrait:puis:
la source
Utilisez
pg_read_file('location_of file')::bytea
.Par exemple,
Manuel
la source
pg_read_binary_file('/path/to/file')
. Voir postgresql.org/docs/current/static/functions-admin.htmlCette solution n’est pas vraiment efficace en termes d’exécution, mais elle est très simple comparée à la création de vos propres en-têtes
COPY BINARY
. De plus, il ne nécessite aucune bibliothèque ou langage de script en dehors de bash.Commencez par convertir le fichier en hexdump, en doublant sa taille.
xxd -p
Cela nous rapproche beaucoup, mais cela introduit des nouvelles lignes gênantes dont nous devons nous occuper:Ensuite, importez les données dans PostgreSQL sous forme de très grand
text
champ. Ce type contient jusqu'à un Go par valeur de champ, nous devrions donc pouvoir nous en tirer dans la plupart des cas:Maintenant que nos données sont une chaîne hex gratuitement grande, nous utilisons PostgresQL
decode
pour les obtenir dans unbytea
type:la source
tr -d '\n'
fonctionne sur la sortie de xxd, qui code le contenu binaire de l'entrée sous forme de caractères hexadécimaux ASCII (0-9 et af). xxd arrive également à produire des sauts de ligne à intervalles réguliers pour rendre la sortie lisible par l'homme, mais dans ce cas, nous souhaitons leur suppression. Les sauts de ligne dans les données d' origine seront sous forme hexadécimale et ne seront pas affectés.La réponse avec xxd est sympa et, pour les petits fichiers, très rapide. Vous trouverez ci-dessous un exemple de script que j'utilise.
la source
Utilisez la fonction Postgres COPY BINARY . Ceci est globalement équivalent aux tables externes d'Oracle .
la source
bytea
colonne?