Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file PostgreSQL\lou导入以及如何将生成的OID获取到更新命令中?_Batch File_Cmd_Postgresql - Fatal编程技术网

Batch file PostgreSQL\lou导入以及如何将生成的OID获取到更新命令中?

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

我正在使用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_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
表来查找二进制文件的描述

即:


如果您的字段是type
bytea
,下面介绍如何执行此操作

\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;