lo

Управление большими объектами (LO, Large Objects).
Схема размещения: ext.
Модуль lo поддерживает управление большими объектами (Large Objects, Binary Large OBjects) и реализует тип данных lo и триггер lo_manage.
Большие объекты (LO, Large Objects или BLOB, Binary Large Objects) предназначены для хранения большого объема данных.
В PostgreSQL имеется механизм для работы с большими объектами, который предоставляет доступ к пользовательским данным в потоковом режиме. Потоковый доступ удобен для обработки данных большого объема, когда невозможно оперировать ими как единым целым.
Особенностью драйвера JDBC (как и ODBC) является то, что спецификация типа предполагает хранение в таблице ссылок на BLOB. Если запись меняется, связанный BLOB удаляется из базы.
В PostgreSQL большие объекты обрабатываются как самостоятельные. Запись в таблице может ссылаться на большой объект по OID, при этом на него могут ссылаться несколько записей таблицы. Если меняется или удаляется такая запись, система не удаляет связанный с ней большой объект.
Вследствие работы стандартного кода, использующего JDBC или ODBC, большой объект не будет удален и может оказаться потерянным, то есть никак не задействованным. Он будет просто занимать место на диске.
Ориентированные на PostgreSQL приложения учитывают особенность логики СУБД и потеря большого объекта не предполагается.
Модуль lo добавляет триггер lo_manage к таблицам, которые содержат ссылки на большие объекты. Этот триггер вызывает функцию lo_unlink, когда вы удаляете или изменяете значение, ссылающееся на большой объект.
Описание функции lo_unlink:
  • вызов:
    lo_unlink(PGconn *conn, Oid lobjId);
  • аргументы:
  • возвращаемое значение:
    • 1: успешно;
    • -1: неуспешно.
  • пример вызова:
    SELECT lo_unlink ('5034');
Для очистки базы данных от потерянных больших объектов можно использовать функциональность приложения vacuumlo.

Использование модуля

  1. Создать таблицу; столбец bigo имеет тип данных lo:
CREATE TABLE t_lo (name text, bigo lo);
  1. Создать триггер lo_manage. В качестве аргумента триггеру передать имя столбца, содержащего уникальные ссылки на большие объекты; триггер будет вызывать функцию удаления большого объекта при изменении или удалении строки:
    CREATE TRIGGER t_bigo BEFORE UPDATE OR DELETE ON t_lo
        FOR EACH ROW EXECUTE FUNCTION lo_manage(bigo);
    

Ссылки на документацию разработчика

Дополнительную информацию по поставляемому модулю lo можно получить по ссылке.
Документация по работе с большими объектами: https://www.postgresql.org/docs/current/largeobjects.html.
Функции управления подключением к базе данных: https://www.postgresql.org/docs/13/libpq-connect.html.
Предыдущий раздел
jsonb_plpythonu
Следующий раздел
ltree
Была ли страница полезной?