2012-03-20 28 views
3

我正在使用Postgres 9.0,我有一個應用程序,我需要將圖像插入到遠程server。於是我就用:PostgeSQL lo_import以及如何將生成的OID導入UPDATE命令?

"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是服務器系統

5432的IP地址是端口號

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

所以我的問題是:我怎麼得到OID後返回psql中的\lo_import

我試圖運行在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' 
         ^
+0

什麼是應用程序的語言?在大多數語言中,有一些功能可以執行客戶端lo_import,這比在單獨的進程中啓動psql並獲取OID更簡單。 – 2012-03-20 13:42:35

+0

@DanielVérité:iam使用'delphi 7'作爲前端 – PresleyDias 2012-03-21 04:18:47

+1

Delphi有幾個PG驅動程序。如果使用[pgdac](http://www.devart.com/pgdac/),您可能會看[此代碼示例](http://www.devart.com/forums/viewtopic.php?t=14083)。如果使用[zeoslib](http://zeos.firmos.at/),顯然TZPostgreSQLBlob對象可能會實現該功能。 – 2012-03-21 14:58:21

回答

3

因爲你的文件駐留在你的本地機器上,並且你想要隱藏t爲BLOB到遠程服務器,你有兩個選擇:

1)將文件傳輸到服務器,並使用server-side function

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

2)使用psql meta-command就像你擁有了它。

但是,您不能將psql元命令與SQL命令混合,這是不可能的。
使用在UPDATE命令psql的變量:LASTOID您在同一PSQL屆\lo_import元命令後立即啓動:

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 
  • \\是分離器的元指令。您需要在""字符串中將\加倍,因爲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 
+0

1.''將文件傳輸到服務器'將不可能在我的情況下.. 2.如何使用':LASTOID'? 'select:LASTOID as loid' does not work – PresleyDias 2012-03-20 12:16:56

+0

+ 1,好的,我會嘗試2.並回來:) – PresleyDias 2012-03-20 12:18:51

+0

嘿,我得到一個錯誤'字段'LASTOID'是一個未知類型' – PresleyDias 2012-03-20 12:29:04

0

使用此命令導入圖像後:

\lo_import '$imagePath' '$imageName' 

您可以通過查詢然後找到二進制文件的說明pg_catalog.pg_largeobject_metadata表存儲您需要的oid值。

即:

"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 "