PostgreSQL \ lo_import以及如何将结果OID放入更新命令中?[英] PostgreSQL \lo_import and how to get the resulting OID into an UPDATE command?

本文是小编为大家收集整理的关于PostgreSQL \ lo_import以及如何将结果OID放入更新命令中?的处理方法,想解了PostgreSQL \ lo_import以及如何将结果OID放入更新命令中?的问题怎么解决?PostgreSQL \ lo_import以及如何将结果OID放入更新命令中?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在使用Postgres 9.0,并且有一个应用程序需要将图像插入远程server.所以我使用:

 "C:\Program Files\PostgreSQL\9.0\bin\psql.exe" -h 192.168.1.12 -p 5432 -d myDB -U my_admin -c  "\lo_import 'C://im/zzz4.jpg'";

其中

192.168.1.12是服务器系统的IP地址

5432是端口号

myDB是服务器数据库名称

my_admin是用户名

"\lo_import 'C://im/zzz4.jpg'"是触发的查询.

 shell screenshot

将图像插入数据库后,我需要在此类表中更新一行:

UPDATE species 
SET    speciesimages=17755;  -- OID from previous command.. how to get the OID ??
WHERE  species='ACCOAA';

所以我的问题是:如何在psql中返回OID?

我尝试在Postgres中运行\lo_import 'C://im/zzz4.jpg',但我会发现一个错误:

ERROR:  syntax error at or near ""\lo_import 'C://im/zzz4.jpg'""
LINE 1: "\lo_import 'C://im/zzz4.jpg'"

i 也尝试了以下方法:

update species
set speciesimages=\lo_import 'C://im/zzz4.jpg'
where species='ACAAC04';

但是我得到了这个错误:

ERROR:  syntax error at or near "\"
LINE 2: set speciesimages=\lo_import 'C://im/zzz4.jpg'
                          ^

推荐答案

由于您的文件位于本地计算机上,并且您想将BLOB导入远程服务器,您有两个选项:

1)将文件传输到服务器并使用 server-side "> server-side功能:

UPDATE species
SET    speciesimages = lo_import('/path/to/server-local/file/zzz4.jpg')
WHERE  species = 'ACAAC04';

2)使用postgresql.org/docs/current/current/interactive/app-psql.html#app-psql-psql-meta-meta-commands" -command 喜欢您.

但是您无法将PSQL Meta命令与SQL-Commands混合,这是不可能的.
在同一PSQL会话中\lo_import meta命令之后立即启动的UPDATE命令中使用psql变量:LASTOID:

:

UPDATE species
SET    speciesimages = :LASTOID
WHERE  species = 'ACAAC04';

脚本(在Linux中工作,我不熟悉Windows Shell脚本):

echo "\lo_import '/path/to/my/file/zzz4.jpg' \\\\ UPDATE species SET speciesimages = :LASTOID WHERE  species = 'ACAAC04';" | \
psql -h 192.168.1.12 -p 5432 -d myDB -U my_admin
  • \\是分离器元命令.您需要在""字符串中加倍\,因为外壳解释了一层.
  • \在新线只是Linux shell中的线延续之前.

替代语法(再次在Linux上进行测试):

psql -h 192.168.1.12 -p 5432 -d myDB -U my_admin << EOF
\lo_import '/path/to/my/file/zzz4.jpg'
UPDATE species
SET    speciesimages = :LASTOID
WHERE  species = 'ACAAC04';
EOF

其他推荐答案

用此命令导入图像后:

\lo_import '$imagePath' '$imageName'

然后,您可以通过查询存储您需要的OID值的表来找到二进制的描述.

IE:

"SELECT oid as `"ID`",
pg_catalog.obj_description(oid, 'pg_largeobject') as `"Description`"
FROM pg_catalog.pg_largeobject_metadata WHERE pg_catalog.obj_description(oid,'pg_largeobject') = '$image' limit 1 "

其他推荐答案

如果您的字段是type bytea.

\lo_import '/cygdrive/c/Users/Chloe/Downloads/Contract.pdf'
update contracts set contract = lo_get(:LASTOID) where id = 77;

导入后使用\lo_list和\lo_unlink.

本文地址:https://www.itbaoku.cn/post/1763803.html