PostgreSQL \ lo_import и как получить полученный OID в команду UPDATE? - PullRequest
5 голосов
/ 20 марта 2012

Я работаю с 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';

Итак, мой вопрос: как мне получить OID, возвращенный после \lo_import вpsql?

Я пытался запустить \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'"

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

Ответы [ 2 ]

4 голосов
/ 20 марта 2012

Поскольку ваш файл находится на локальном компьютере, и вы хотите импортировать BLOB-объект на удаленный сервер, у вас есть два варианта:

1) Передайте файл на сервер и используйте серверную функцию :

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

2) Используйте метакоманду psql , как у вас.

Но вы не можете смешивать метакоманды psql с SQL-командами, это невозможно.
Используйте переменную psql :LASTOID в команде UPDATE, которую вы запускаете сразу после мета-команды \lo_import в том же сеансе psql:

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

Чтобы написать это (работает в Linux, я не знаком со сценариями оболочки Windows):

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.

Альтернативный синтаксис (снова протестирован в 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 голосов
/ 08 августа 2013

После импорта изображения с помощью этой команды:

\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 "
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...