玩转大数据

PostgreSQL 操作大对象

2025-07-15  本文已影响0人  AlienPaul

前言

通常来说在关系型数据库中保存大对象有如下方式:

PG中没有提供MySQL或者Oracle中的Blob,Clob类型的字段。但PG提供的大对象处理方式简化了上述的方法2,无需人工去上传文件到文件系统然后再保存路径。将大对象直接上传到PG后,该对象本身的存储和生成该对象引用的过程无需使用者再费心。

接下来为大家介绍PG操作大对象的方式。

上传大对象

SELECT lo_from_bytea(%s, %s::bytea) as loid;

其中第一个参数为loid(Large object ID)。如果设定为0,则使用一个空闲的loid并返回。
第二个参数为大对象的byte数组。

获取大对象

SELECT lo_get(%s) as "data";

需要的参数为loid,即第一步上传大对象返回的结果。

删除大对象

SELECT lo_unlink(%s);

参数为loid。
返回1表示删除成功,-1表示删除失败。

查询PG中保存的所有大对象

select * from pg_largeobject;

该表包含如下字段:

通过如下语句可以查询到大对象的元数据:

select * from pg_largeobject_metadata;

该表包含如下字段:

使用示例

首先使用lo_from_bytea函数上传大对象到pg。例如:

select lo_from_bytea(0, '\xffffff00')

该SQL执行成功之后会返回上传大对象的id(loid)。

这个ID相当于该大对象的身份信息,即以后查询,修改或者删除该大对象都要使用该ID。因此需要将他保存在业务表当中。

例如我们上传的大对象为文件内容。我们有如下文件表:

CREATE TABLE file (
    create_time timestamptz NOT NULL,
    update_time timestamptz NOT NULL,
    id uuid NOT NULL,
    file_name varchar(256) NOT NULL,
    loid int4 NOT NULL,
    meta jsonb NOT NULL
);

在上传完大对象之后,需要将返回的loid值保存在file表的loid字段中。

其他操作大对象的函数

上一篇 下一篇

猜你喜欢

热点阅读