0

我正在尝试在 postgresql(pg 指挥官)中编写一个更新 sql 语句,该语句将更新用户配置文件图像列

我试过这个:

update mytable set avatarImg = pg_read_file('/Users/myUser/profile.png')::bytea where userid=5;

得到ERROR: absolute path not allowed

4

3 回答 3

1
  1. 在客户端读取文件。
  2. 将内容转义为 bytea
  3. 正常插入数据库。
于 2015-06-02T06:18:51.527 回答
0

(详细说明理查德的正确但简洁的答案;他的应该被标记为正确):

pg_read_file实际上仅用作管理工具,并且根据手册

表 9-72 中显示的函数提供对托管服务器的机器上的文件的本地访问。只能访问数据库集群目录和 log_directory 中的文件。

即使该限制不适用,使用pg_read_file也是不正确的;你必须使用pg_read_binary_file. 你不能只是阅读text和投射bytea喜欢那样。

正如理查德所说,路径限制意味着您必须使用客户端应用程序读取文件。从客户端读取文件,将其设置为byteaSQL 中的放置参数,然后发送查询。

或者,您可以使用lo_import将服务器端文件作为二进制大对象读取,然后将其读取为bytea并删除二进制大对象。

于 2015-06-02T06:51:24.507 回答
0

pg_read_file 只能从数据目录路径读取文件,如果您想知道您的数据目录路径,请使用:

SHOW data_directory;

例如它会显示,

/var/lib/postgresql/data

将您的文件复制到提到的目录。之后,您只能在查询中使用文件名。

UPDATE student_card SET student_image = pg_read_file('up.jpg')::bytea;

或者可以使用 pg_read_binary_file 函数。

UPDATE student_card SET student_image = pg_read_binary_file('up.jpg')::bytea;
于 2019-04-23T14:33:45.117 回答