大对象操作办法:
1.在PG中创建N个大对象,一个大对象即为一个OID。
select lo_create(0); //返回大对象的oid。
2.-- 写入数据到大对象,此处数据应该是上面导出的一行的列的二进制值
SELECT lo_write(large_object, 'Hello, Large Object!');
1.导出每个二进制的值,针对每个值建个大对象。
2.在原始表中把bytea字段改成OID类型。
//假设这是一个图像表,有一个字段名字,一个字段图像数据。这个oid类型就是一个大对象。
CREATE TABLE image(name text, raster oid);
//那么往图像里插入数据时,针对大对象字段就该调用函数lo_import,这是本地的文件导入进去:
INSERT INTO image VALUES('image1', lo_import('/tmp/screenshot.png'));
其实执行lo_import就会在pg里面生成大对象,这个大对象有自己的oid,底层是一个单独的数据文件,和表文件的存储隔离开来的。
可以通过select * from FROM pg_largeobject查询到这个大对象的一些信息。
所以针对那种表,有多少行记录意味着也就有多少大对象,且需要将表的那个字段的值,最好先搞下来再导入。
postgres=# INSERT INTO image VALUES('image1', lo_import('/tmp/screenshot.png'));
INSERT 0 1
postgres=# SELECT loid, COUNT(page no) FROM pg_largeobject GROUP BY loid;
loid | count
-------±------
24598 | 25
(1 row)
postgres=# SELECT raster, lo_export(raster, '/tmp/screenshot-e.png') FROM image WHERE name = 'image1';
raster | lo_export
--------±----------
24598 | 1
(1 row)
postgres=# ! md5sum /tmp/screenshot.png /tmp/screenshot-e.png
dc51d60215f547a897d4d73beba65ded /tmp/screenshot.png
dc51d60215f547a897d4d73beba65ded /tmp/screenshot-e.png