Esta pregunta no se trata de bytea v. Oid v. Blobs v. Objetos grandes, etc.
Tengo una tabla que contiene un integer
campo de clave principal y un bytea
campo. Me gustaría ingresar datos en el bytea
campo. Esto, presumiblemente, lo puede hacer uno de los PL/
idiomas, y puedo considerar hacerlo PL/Python
en el futuro.
Como todavía estoy probando y experimentando, simplemente me gustaría insertar datos de un archivo (en el servidor) usando declaraciones SQL "estándar". Soy consciente de que solo los administradores con permiso de escritura en el servidor podrán insertar datos de la manera que me gustaría. No estoy preocupado por eso en esta etapa ya que los usuarios no estarían insertando bytea
datos en este momento. He buscado en varios sitios de StackExchange, los archivos PostgreSQL e Internet en general, pero no he podido encontrar una respuesta.
Editar: Esta discusión de 2008 implica que lo que quiero hacer no es posible. ¿Cómo se bytea
usan los campos entonces?
Editar: Esta pregunta similar de 2005 sigue sin respuesta.
Resuelto: Los detalles proporcionados aquí en el psycopg
sitio web proporcionaron la base para una solución que he escrito en Python. También es posible insertar datos binarios en una bytea
columna usando PL/Python
. No sé si esto es posible usando SQL "puro".
fuente
blob
). Si eso fue un error, me disculpo sinceramente.blob
está bien, tal vezdatafile
sea irrelevante.Respuestas:
como superusuario:
lo_get
se introdujo en 9.4, por lo que para versiones anteriores necesitaría:luego:
fuente
Uso
pg_read_file('location_of file')::bytea
.Por ejemplo,
Manual
fuente
pg_read_binary_file('/path/to/file')
. Ver postgresql.org/docs/current/static/functions-admin.htmlEsta solución no es exactamente eficiente en términos de tiempo de ejecución, pero es trivialmente fácil en comparación con hacer sus propios encabezados
COPY BINARY
. Además, no requiere ninguna biblioteca o lenguaje de script fuera de bash.Primero, convierta el archivo en un hexdump, duplicando el tamaño del archivo.
xxd -p
nos acerca bastante, pero arroja algunas líneas molestas de las que tenemos que ocuparnos:A continuación, importe los datos en PostgreSQL como un
text
campo muy grande . Este tipo contiene hasta un GB por valor de campo, por lo que deberíamos estar bien para la mayoría de los propósitos:Ahora que nuestros datos son una cadena hexadecimal gratuita, utilizamos PostgresQL
decode
para obtener unbytea
tipo:fuente
tr -d '\n'
está operando en la salida de xxd, que codifica el contenido binario de la entrada como caracteres hexadecimales ASCII (0-9 y af). xxd también pasa a los saltos de línea de salida a intervalos regulares para que la salida sea legible para los humanos, pero en este caso queremos que se eliminen. Los avances de línea en los datos originales estarán en forma hexadecimal y no se verán afectados.La respuesta con xxd es agradable y, para archivos pequeños, muy rápida. A continuación se muestra un script de ejemplo que estoy usando.
fuente
Utilice la función BINARIO COPIA de Postgres . Esto es ampliamente equivalente a las tablas externas de Oracle .
fuente
bytea
columna?