如何下载Postgres bytea列作为文件

Cho*_*ung 28 postgresql byte file

目前,我有一些文件存储在postgres 8.4中作为bytea.文件类型为.doc,.odt,.pdf,.txt等.

我可以知道如何下载Postgres中存储的所有文件,因为我需要进行备份.我需要它们的原始文件类型而不是bytea格式.

谢谢!

Grz*_*ski 41

一个简单的选项是使用COPY带有encode十六进制格式的命令,然后应用xxdshell命令(使用-p 连续hexdump样式开关).例如,假设我在samples表的bytea列中有jpg图像:

\copy (SELECT encode(file, 'hex') FROM samples LIMIT 1) TO
    '/home/grzegorz/Desktop/image.hex'

$ xxd -p -r image.hex > image.jpg
Run Code Online (Sandbox Code Playgroud)

当我检查它在实践中工作.

  • 是否可以不依赖 xxd 来做到这一点?是不是有一个纯粹的基于 postgresql 的解决方案来实现复制? (2认同)

Chr*_*don 6

这是我能想到的最简单的事情:

psql -qAt "select encode(file,'base64') from files limit 1" | base64 -d
Run Code Online (Sandbox Code Playgroud)

-qAt很重要,因为它剥离了输出的任何格式。这些选项在psqlshell 中也可用。

  • 当我添加 `-c` 时,这个解决方案对我有用,根据内联帮助告诉 psql“仅运行单个命令(SQL 或内部)并退出” (3认同)

小智 5

尝试这个:

 COPY (SELECT yourbyteacolumn FROM yourtable WHERE <add your clauses here> ...) TO 'youroutputfile' (FORMAT binary)
Run Code Online (Sandbox Code Playgroud)

  • 这有效;但是输出需要额外的处理。参见[二进制格式](https://www.postgresql.org/docs/9.6/static/sql-copy.html#AEN77714) (4认同)

Pau*_*per 5

64位基数

psql -Aqt -c "SELECT encode(content, 'base64') FROM ..." | base64 -d > file
Run Code Online (Sandbox Code Playgroud)

xxd

psql -Aqt -c "SELECT encode(content, 'hex') FROM ..." | xxd -p -r > file
Run Code Online (Sandbox Code Playgroud)


Den*_*rdy 0

据我所知,字节到文件需要在应用程序级别完成。

(9.1 可能会通过文件系统数据包装器 contrib 来改变这一点。还有一个 lo_export 函数,但它在这里不适用。)