Saltar al contenido

¿Cómo insertar datos (archivo) en una columna bytea de PostgreSQL?

Contamos con tu ayuda para difundir nuestros enunciados referente a las ciencias de la computación.

Solución:

como superusuario:

create or replace function bytea_import(p_path text, p_result out bytea) 
                   language plpgsql as $$
declare
  l_oid oid;
begin
  select lo_import(p_path) into l_oid;
  select lo_get(l_oid) INTO p_result;
  perform lo_unlink(l_oid);
end;$$;

lo_get se introdujo en 9.4, por lo que para versiones anteriores necesitaría:

create or replace function bytea_import(p_path text, p_result out bytea) 
                   language plpgsql as $$
declare
  l_oid oid;
  r record;
begin
  p_result := '';
  select lo_import(p_path) into l_oid;
  for r in ( select data 
             from pg_largeobject 
             where loid = l_oid 
             order by pageno ) loop
    p_result = p_result || r.data;
  end loop;
  perform lo_unlink(l_oid);
end;$$;

después:

insert into my_table(bytea_data) select bytea_import('/my/file.name');

Usar pg_read_file('location_of file')::bytea.

Por ejemplo,

create table test(id int, image bytea);
insert into test values (1, pg_read_file('/home/xyz')::bytea);

Manual

Esta 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 para COPY BINARY. Además, no requiere bibliotecas ni lenguajes de secuencias de comandos fuera de bash.

Primero, convierta el archivo en un volcado hexadecimal, duplicando el tamaño del archivo. xxd -p nos acerca bastante, pero arroja algunas nuevas líneas molestas de las que tenemos que ocuparnos:

xxd -p /path/file.bin | tr -d 'n' > /path/file.hex

A continuación, importe los datos en PostgreSQL como un gran text campo. Este tipo contiene hasta un GB por valor de campo, por lo que debería estar bien para la mayoría de los propósitos:

CREATE TABLE hexdump (hex text); COPY hexdump FROM '/path/file.hex';

Ahora que nuestros datos son un hex gratuitamente grande stringusamos PostgresQL decode para meterlo en un bytea escribe:

CREATE TABLE bindump AS SELECT decode(hex, 'hex') FROM hexdump;

Valoraciones y reseñas

No se te olvide dar visibilidad a este artículo si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *