繁体   English   中英

客户端脚本中的PSQL lo_import

[英]PSQL lo_import in client side script

我们有一个简单的sql脚本,我们维护它来设置您的模式并填充一组文本/示例值-就像创建表,在表中创建表插入表一样,并使用一个简单的shell脚本运行该脚本,该脚本调用PSQL

我们的一个表需要文件-我要做的就是将文件与脚本放在同一目录中,并执行类似插入存储库(id,图片)值(“ first”,lo_import('first.jpg')的操作)

但是我收到错误消息说必须是超级用户才能使用服务器端脚本。 有什么办法可以实现? 我只有一个.sql文件和一堆图像文件,并且通过对文件运行psql导入它们?

不能以超级用户身份运行。

使用psql ,您可以编写如下的shell脚本:

oid=`psql -At -c "\lo_import 'first.jpg'" | tail -1 | cut -d " " -f 2`
psql -Aqt -c "INSERT INTO repository (id, picture) values ('first', $oid)"

因为注释不能包含代码-多亏了Laurenz,我使它像下面这样“工作”:

drop table if exists some_landing_table;
create table some_landing_table( load_time timestamp, filename varchar, data bytea);

\set the_file 'example.jpg';
\lo_import 'example.jpg';
insert into some_landing_table
    select now(), 'example.jpg', string_agg(data,decode('','escape') order by pageno)
    from 
        pg_largeobject 
    where 
        loid = (select max(loid) from pg_largeobject);

select lo_unlink( max(loid) )   from pg_largeobject;

但是,这很丑陋,原因有两个:

  • 我似乎无法以任何方式将\\ lo_import的结果转换为变量。 即使select \\lo_import filename有效,但select \\lo_import filename select \\lo_import filename into x却无效。
  • 我不能使用变量-如果我执行\\lo_import :the_file它只是说example.jpg不存在-即使将其直接放入也可以正常工作
  • 我没有找到比decode('','escape')更简单的方法来提供长度为0的bytea字段

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM