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.