我有一个PostgreSQL 9.1数据库,其中图片存储为大对象。 有没有办法通过SQL查询将文件导出到客户端文件系统?
select lo_export(data,'c:\img\test.jpg') from images where id=0;
我正在寻找类似于上面一行的方法,但是以客户端为目标。 提前谢谢!
答案 0 :(得分:9)
这个答案很晚,但会有所帮助,所以我确定
要将图像从服务器获取到客户端系统,您可以使用此
"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' ";
哪里
文档在这里commandprompt.com
答案 1 :(得分:2)
乔治,
根据documentation for 9.1,lo_export是相对于执行调用的客户端。因此,如果clientA连接到databaseB,当clientA执行您的SQL时,lo_export应该在您告诉它的clientA上创建该文件。
鉴于您已经在MATLAB下声明使用JDBC(我不熟悉您在那里可以做的事情,也不熟悉执行调用的界面),如果您从手动建立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语句来包装和清理连接。
答案 2 :(得分:1)
这是不可能的,因为所有PostgreSQL服务器都可以通过客户端建立的网络连接将数据发送回客户端。 特别是,它无法在客户端文件系统上创建文件,只有客户端代码才能这样做。
答案 3 :(得分:0)
来源: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';