Batch file PostgreSQL\lou导入以及如何将生成的OID获取到更新命令中?
我正在使用Postgres 9.0,我有一个应用程序,需要在远程Batch file PostgreSQL\lou导入以及如何将生成的OID获取到更新命令中?,batch-file,cmd,postgresql,Batch File,Cmd,Postgresql,我正在使用Postgres 9.0,我有一个应用程序,需要在远程服务器中插入图像。因此,我使用: "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_imp
服务器中插入图像。因此,我使用:
"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'”
是触发的查询
将图像插入数据库后,我需要更新表中的一行,如下所示:
UPDATE species
SET speciesimages=17755; -- OID from previous command.. how to get the OID ??
WHERE species='ACCOAA';
所以我的问题是:如何在psql中导入\lou
后返回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'"
我也尝试了以下方法:
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) 将文件传输到服务器并使用:
2) 像你拥有的一样使用它
但是不能将psql元命令与SQL命令混合使用,这是不可能的。
在同一psql会话中执行\lou import
meta命令后立即启动的更新
命令中使用psql变量:LASTOID
:
UPDATE species
SET speciesimages = :LASTOID
WHERE species = 'ACAAC04';
要编写脚本(在Linux中工作,我不熟悉Windows shell脚本):
\\
是分隔符元命令。您需要将\
字符串中的\
加倍,因为shell解释一个层
- 新行之前的
\
在Linux shell中只是行的延续
替代语法(再次在Linux上测试):
psql-h 192.168.1.12-p 5432-d myDB-U my_admin使用以下命令导入图像后:
\lo_import '$imagePath' '$imageName'
然后,您可以通过查询存储所需oid值的pg_catalog.pg_largeobject_metadata
表来查找二进制文件的描述
即:
如果您的字段是typebytea
,下面介绍如何执行此操作
\lo_import '/cygdrive/c/Users/Chloe/Downloads/Contract.pdf'
update contracts set contract = lo_get(:LASTOID) where id = 77;
导入后使用\lo\u list
和\lo\u取消链接
。1.将文件传输到服务器
。。2.如何使用:LASTOID
<代码>选择:LASTOID作为loid
不work@PresleyDias当前位置对我有效,我刚刚测试过。只在psql内部工作!在将SQL命令发送到服务器之前,将替换psql变量。不要忘记:
前缀。仅适用于psql内部代码>哦,好吧,我没想到,我会再试一次。我在CMD中尝试了这个“C:\Program Files\PostgreSQL\9.0\bin\psql.exe”-h 192.168.1.12-p 5432-d nansis-U nansis\U admin-C“更新物种集物种图像=:LASTOID WHERE species='ACAAC24'
,但我在CMD中或附近得到了这个错误syntec错误”:
@PresleyDias:这行不通,因为-c
开关只向服务器传递一个SQL字符串。对于:LASTOID
要保存值,需要先执行meta命令,然后以交互模式执行SQL命令,或者像我在回答中演示的那样。为了便于编写脚本,我添加了另一个语法变体。例如Linux shell。应用程序的语言是什么?在大多数语言中,都有用于客户端LOU导入的函数,这比在单独的进程中启动psql并获取OID要容易得多。@DanielVérité:iam使用delphi 7
作为前端delphi有几个PG驱动程序。如果用的话你可以看看。如果使用,显然有一个TZPostgreSQLBlob对象可能实现了该功能。或者您可以使用\lou list
。
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'
"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 "
\lo_import '/cygdrive/c/Users/Chloe/Downloads/Contract.pdf'
update contracts set contract = lo_get(:LASTOID) where id = 77;