这个问题与 bytea v. oid v. blobs v. large objects 等无关。
我有一个包含主键integer
字段和bytea
字段的表。我想在bytea
字段中输入数据。这大概可以通过其中一种PL/
语言来完成,我将来可能会考虑这样做PL/Python
。
由于我仍在测试和试验,我只想使用“标准”SQL 语句从文件(在服务器上)插入数据。我知道只有在服务器上具有写入权限的管理员才能以我想要的方式插入数据。在这个阶段我并不担心,因为用户目前不会插入bytea
数据。我已经搜索了各种 StackExchange 站点、PostgreSQL 档案和互联网,但一直没有找到答案。
编辑: 2008 年的 这个讨论意味着我想做的事情是不可能的。bytea
那么字段 是如何使用的呢?
编辑: 这个2005 年的类似问题仍未得到解答。
已解决:网站上提供的详细信息psycopg
为我用 Python 编写的解决方案提供了基础。也可以使用 . 将二进制数据插入bytea
列中PL/Python
。我不知道这是否可以使用“纯”SQL。
使用
pg_read_file('location_of file')::bytea
.例如,
手动的
作为超级用户:
lo_get
在 9.4 中引入,因此对于旧版本,您需要:然后:
此解决方案在运行时方面并不十分有效,但与为
COPY BINARY
. 此外,它不需要 bash 之外的任何库或脚本语言。首先,将文件转换为 hexdump,使文件大小翻倍。
xxd -p
让我们非常接近,但它会引发一些我们必须处理的烦人的换行符:接下来,将 PostgreSQL 中的数据作为一个非常大的
text
字段导入。这种类型每个字段值最多可容纳 1 GB,因此对于大多数用途我们应该没问题:现在我们的数据是一个非常大的十六进制字符串,我们使用 PostgresQL
decode
将它变成一个bytea
类型:xxd的答案很好,对于小文件来说,速度非常快。下面是我正在使用的示例脚本。
这是在没有超级用户权限的情况下(例如在 Heroku 上)的方法。
您可以使用
\lo_list
查看大对象并\lo_unlink
删除它们。我的示例中的contract
字段是bytea
.使用 Postgres复制二进制函数。这大致相当于 Oracle 的外部表。