Esta pregunta no se trata de bytea v. Oid v. Blobs v. Objetos grandes, etc.
Tengo una tabla que contiene un integercampo de clave principal y un byteacampo. Me gustaría ingresar datos en el byteacampo. Esto, presumiblemente, lo puede hacer uno de los PL/idiomas, y puedo considerar hacerlo PL/Pythonen 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 byteadatos 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 byteausan los campos entonces?
Editar: Esta pregunta similar de 2005 sigue sin respuesta.
Resuelto: Los detalles proporcionados aquí en el psycopgsitio web proporcionaron la base para una solución que he escrito en Python. También es posible insertar datos binarios en una byteacolumna usando PL/Python. No sé si esto es posible usando SQL "puro".
fuente

blob). Si eso fue un error, me disculpo sinceramente.blobestá bien, tal vezdatafilesea irrelevante.Respuestas:
como superusuario:
lo_getse 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 -pnos acerca bastante, pero arroja algunas líneas molestas de las que tenemos que ocuparnos:A continuación, importe los datos en PostgreSQL como un
textcampo 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
decodepara obtener unbyteatipo: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
byteacolumna?