Esta questão não é sobre bytea v. Oid v. Blobs v. Objetos grandes, etc.
Eu tenho uma tabela que contém um integer
campo de chave primária e um bytea
campo. Eu gostaria de inserir dados no bytea
campo. Presumivelmente, isso pode ser feito por um dos PL/
idiomas, e eu posso tentar fazê-lo PL/Python
no futuro.
Como ainda estou testando e experimentando, gostaria de inserir dados de um arquivo (no servidor) usando instruções SQL "padrão". Estou ciente de que apenas os administradores com permissão de gravação no servidor poderão inserir dados da maneira que gostaria. Não estou preocupado com isso nesse estágio, pois os usuários não estariam inserindo bytea
dados no momento. Pesquisei nos vários sites 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 eu 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".
fonte
blob
). Se isso foi um erro, peço desculpas sinceramente.blob
está bem, talvezdatafile
seja irrelevante.Respostas:
como superusuário:
lo_get
foi introduzido na 9.4, portanto, para versões mais antigas, você precisaria de:então:
fonte
Use
pg_read_file('location_of file')::bytea
.Por exemplo,
Manual
fonte
pg_read_binary_file('/path/to/file')
. Veja postgresql.org/docs/current/static/functions-admin.htmlEssa solução não é exatamente eficiente em termos de tempo de execução, mas é trivialmente fácil se comparada à criação de seus próprios cabeçalhos
COPY BINARY
. Além disso, ele 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 precisamos cuidar:Em seguida, importe os dados no PostgreSQL como um
text
campo muito grande . Esse tipo possui até um GB por valor de campo, portanto, devemos concordar com a maioria dos propósitos:Agora que nossos dados são uma sequência hexadecimal grande e gratuita, usamos o PostgresQL
decode
para inseri -lo em umbytea
tipo:fonte
tr -d '\n'
está operando na saída do xxd, que codifica o conteúdo binário da entrada como caracteres hexadecimais ASCII (0-9 e af). O xxd também acontece com feeds de linha de saída em intervalos regulares para tornar a saída legível por humanos, mas, neste caso, queremos que sejam removidos. Os feeds de linha nos dados originais estarão em formato hexadecimal e não serão afetados.A resposta com o xxd é boa e, para arquivos pequenos, muito rápida. Abaixo está um exemplo de script que estou usando.
fonte
Use a função COPY BINARY do Postgres . Isso é amplamente equivalente às tabelas externas da Oracle .
fonte
bytea
coluna?