如何用psql导出二进制文件(没有PGCOPY标头)?

时间:2015-12-17 13:18:14

标签: database postgresql export psql

我在PostgreSQL DB中有一个bytea列,其中包含PDF文件。 如何使用psql导出该文件?

我试过了:

psql -U <USER> -h <HOST> -p <PORT> -d <DB> -c "\copy (select <column> from <table> where <column> = <id>) to STDOUT with BINARY;" > output.pdf

保存文件,我可以在PDF阅读器中打开它。但是,当我使用hexdump -C output.pdf | head检查文件时,我发现它的标题以PGCOPY开头。

如何在没有PGCOPY标题的情况下导出该文件?

2 个答案:

答案 0 :(得分:10)

我使用Postgre的encode()以十六进制和bash xxd从十六进制解码:

psql -U <USER> -h <HOST> -p <PORT> -d <DB> -c "\copy (SELECT encode(<column>, 'hex') from <table> where <column> = <id>) to STDOUT"  | xxd -p -r > output

文件看起来不错:

$ hexdump -C output | head -n 5
00000000  25 50 44 46 2d 31 2e 36  0d 25 e2 e3 cf d3 0d 0a  |%PDF-1.6.%......|
00000010  38 37 20 30 20 6f 62 6a  0d 3c 3c 2f 4c 69 6e 65  |87 0 obj.<</Line|
00000020  61 72 69 7a 65 64 20 31  2f 4c 20 31 30 32 33 32  |arized 1/L 10232|
00000030  32 35 2f 4f 20 38 39 2f  45 20 31 35 36 35 30 36  |25/O 89/E 156506|
00000040  2f 4e 20 31 37 2f 54 20  31 30 32 32 38 30 36 2f  |/N 17/T 1022806/|

答案 1 :(得分:2)

二进制COPY OUT文件仅供COPY IN命令使用。没有办法阻止Postgres编写文件/行/字段标题。

您可以尝试自行删除它们 - 无论是在创建文件之后,还是使用dd语句将其直接导入COPY TO PROGRAM - 但请记住,标题可能会在将来发生变化发布Postgres。

据我所知,Postgres提供的编写二进制文件的唯一机制是lo_export,尽管你必须跳过一些箍才能将数据转换为大数据对象格式。

或者,您可以使用不受信任的程序语言(PL/PerlUPL/PythonU)编写自己的函数。