PostgreSQL \ lo_import以及如何将生成的OID转换为UPDATE命令?

Pre*_*ias 5 postgresql cmd batch-file

我正在使用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'";
Run Code Online (Sandbox Code Playgroud)

哪里

192.168.1.12 是服务器系统的IP地址

5432 是端口号

myDB 是服务器数据库名称

my_admin 是用户名

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

外壳截图

将图像插入数据库后,我需要像这样更新表中的一行:

UPDATE species 
SET    speciesimages=17755;  -- OID from previous command.. how to get the OID ??
WHERE  species='ACCOAA';
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:如何在psql中得到OID返回值\lo_import

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

ERROR:  syntax error at or near ""\lo_import 'C://im/zzz4.jpg'""
LINE 1: "\lo_import 'C://im/zzz4.jpg'"
Run Code Online (Sandbox Code Playgroud)

试过这个:

update species
set speciesimages=\lo_import 'C://im/zzz4.jpg'
where species='ACAAC04';
Run Code Online (Sandbox Code Playgroud)

但是我得到这个错误:

ERROR:  syntax error at or near "\"
LINE 2: set speciesimages=\lo_import 'C://im/zzz4.jpg'
                          ^
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 5

由于您的文件驻留在本地计算机上,并且您希望将 blob 导入远程服务器,因此您有两个选择:

1) 将文件传输到服务器并使用服务器端功能

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

2)像你一样使用psql 元命令

但是您不能将 psql 元命令与 SQL 命令混合使用,这是不可能的。在同一个 psql 会话中的meta 命令之后立即启动 的命令中
使用 psql 变量::LASTOIDUPDATE\lo_import

UPDATE species
SET    speciesimages = :LASTOID
WHERE  species = 'ACAAC04';
Run Code Online (Sandbox Code Playgroud)

编写脚本(适用于 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
Run Code Online (Sandbox Code Playgroud)
  • \\是分隔符元命令。你需要加倍的\,在一个""字符串,因为shell解释一层。
  • \ 在换行符之前只是 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
Run Code Online (Sandbox Code Playgroud)