我正在尝试在 postgresql(pg 指挥官)中编写一个更新 sql 语句,该语句将更新用户配置文件图像列
我试过这个:
update mytable set avatarImg = pg_read_file('/Users/myUser/profile.png')::bytea where userid=5;
得到ERROR: absolute path not allowed
我正在尝试在 postgresql(pg 指挥官)中编写一个更新 sql 语句,该语句将更新用户配置文件图像列
我试过这个:
update mytable set avatarImg = pg_read_file('/Users/myUser/profile.png')::bytea where userid=5;
得到ERROR: absolute path not allowed
(详细说明理查德的正确但简洁的答案;他的应该被标记为正确):
pg_read_file
实际上仅用作管理工具,并且根据手册:
表 9-72 中显示的函数提供对托管服务器的机器上的文件的本地访问。只能访问数据库集群目录和 log_directory 中的文件。
即使该限制不适用,使用pg_read_file
也是不正确的;你必须使用pg_read_binary_file
. 你不能只是阅读text
和投射bytea
喜欢那样。
正如理查德所说,路径限制意味着您必须使用客户端应用程序读取文件。从客户端读取文件,将其设置为bytea
SQL 中的放置参数,然后发送查询。
或者,您可以使用lo_import
将服务器端文件作为二进制大对象读取,然后将其读取为bytea
并删除二进制大对象。
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;