Esta questão não é sobre bytea v. oid v. blobs v. objetos grandes, etc.
Eu tenho uma tabela contendo um campo de chave primária integer
e um bytea
campo. Eu gostaria de inserir dados no bytea
campo. Isso pode, presumivelmente, ser feito por um dos PL/
idiomas, e posso pensar em fazer isso PL/Python
no futuro.
Como ainda estou testando e experimentando, gostaria simplesmente de inserir dados de um arquivo (no servidor) usando instruções SQL "padrão". Estou ciente de que apenas administradores com permissão de gravação no servidor poderão inserir dados da maneira que eu gostaria. Não estou preocupado com isso neste estágio, pois os usuários não estariam inserindo bytea
dados no momento. Pesquisei em vários sites do StackExchange, nos arquivos do PostgreSQL e na Internet em geral, mas não consegui encontrar uma resposta.
Edit: Esta discussão de 2008 implica que o que eu quero fazer não é possível. Como os bytea
campos são usados então?
Edit: Esta pergunta semelhante de 2005 permanece sem resposta.
Resolvido: Os detalhes fornecidos aqui no psycopg
site forneceram a base para uma solução que escrevi em Python. Também pode ser possível inserir dados binários em uma bytea
coluna usando PL/Python
. Não sei se isso é possível usando SQL "puro".
Usar
pg_read_file('location_of file')::bytea
.Por exemplo,
Manual
como superusuário:
lo_get
foi introduzido em 9.4, então para versões mais antigas você precisaria:então:
Essa solução não é exatamente eficiente em termos de tempo de execução, mas é trivialmente fácil em comparação com a criação de seus próprios cabeçalhos para
COPY BINARY
. Além disso, não requer bibliotecas ou linguagens de script fora do bash.Primeiro, converta o arquivo em um hexdump, dobrando o tamanho do arquivo.
xxd -p
nos aproxima bastante, mas lança algumas novas linhas irritantes que temos que cuidar:Em seguida, importe os dados no PostgreSQL como um
text
campo muito grande. Esse tipo contém até um GB por valor de campo, portanto, devemos ficar bem para a maioria dos propósitos:Agora que nossos dados são uma string hexadecimal gratuita grande, usamos PostgresQL's
decode
para colocá-los em umbytea
tipo:A resposta com xxd é boa e, para arquivos pequenos, muito rápida. Abaixo está um script de exemplo que estou usando.
Aqui está como fazer isso sem privilégios de superusuário (como no Heroku).
Você pode usar
\lo_list
para ver os objetos grandes e\lo_unlink
excluí-los. Ocontract
campo no meu exemplo ébytea
.Use a função COPY BINARY do Postgres . Isso é amplamente equivalente às tabelas externas da Oracle .