PostgreSQL экспортирует большой объект клиенту - PullRequest
5 голосов
/ 09 января 2012

У меня есть база данных PostgreSQL 9.1, в которой изображения хранятся в виде больших объектов. Есть ли способ экспортировать файлы в файловую систему клиента через SQL-запрос?

select lo_export(data,'c:\img\test.jpg') from images where id=0;

Я ищу способ, похожий на строку выше, но с клиентом в качестве цели. Заранее спасибо!

Ответы [ 4 ]

9 голосов
/ 17 февраля 2012

этот ответ очень поздно, но он будет полезен, так что я уверен, что кто-то ответит

Чтобы получить изображения с сервера в клиентскую систему , вы можете использовать это

"C:\Program Files\PostgreSQL\9.0\bin\psql.exe" -h 192.168.1.101 -p 5432 -d mDB -U mYadmin -c  "\lo_export 19135 'C://leeImage.jpeg' ";

Где

  1. h 192.168.1.101 : IP-адрес серверной системы
  2. -d мДБ : имя базы данных
  3. -U мЯдмин : имя пользователя
  4. \ lo_export : функция экспорта, которая создаст образ в расположении системы клиента
  5. C: //leeImage.jpeg: местоположение и имя целевого изображения из OID изображения
  6. 19135 : это OID изображения в вашей таблице.

документация здесь commandprompt.com

2 голосов
/ 09 января 2012

Георг

Согласно документации для 9.1 , lo_export относится к клиенту, выполняющему вызов. Так что, если clientA подключен к базе данных B, когда clientA выполняет ваш SQL, lo_export должен создать файл на clientA, где вы сказали ему.


В свете того факта, что вы указали, что используете JDBC под MATLAB (я не знаком с тем, что вы можете сделать там, и не знаком с интерфейсом для выполнения вызова), если вы вызываете это из соединение JDBC вручную:

java.sql.Connection conn= ...
java.sql.Statement stmt= conn.createStmt();
java.sql.ResultSet rs= stmt.executeQuery("select data from images where id=0");
// Assume one result
rs.next();
// Gets the blob input stream
InputStream blobData= rs.getInputStream(1);

// At this point you will have to write it to a file. 
// See below

rs.close();
stmt.close();
conn.close();

Для краткости я играл очень свободно и быстро с операциями JDBC. Должно быть больше проверки ошибок, а также операторов try / catch / finally, чтобы обернуть и очистить соединения.

Пример копирования файла .

1 голос
/ 10 января 2012

Это невозможно, поскольку все, что может сделать сервер PostgreSQL, - это отправить данные обратно клиенту через сетевое соединение, которое установил клиент.В частности, он не может создать файл в файловой системе клиента, это может сделать только клиентский код.

0 голосов
/ 23 февраля 2015

Источник: http://www.postgresql.org/docs/8.4/static/lo-funcs.html

CREATE TABLE image (
    name            text,
    raster          oid
);

SELECT lo_creat(-1);       -- returns OID of new, empty large object

SELECT lo_create(43213);   -- attempts to create large object with OID 43213

SELECT lo_unlink(173454);  -- deletes large object with OID 173454

INSERT INTO image (name, raster)
    VALUES ('beautiful image', lo_import('/etc/motd'));

INSERT INTO image (name, raster)  -- same as above, but specify OID to use
    VALUES ('beautiful image', lo_import('/etc/motd', 68583));

SELECT lo_export(image.raster, '/tmp/motd') FROM image
    WHERE name = 'beautiful image';
...