Pg lo unlink: примеры (PHP)

Работа с pg_lo_unlink: удаление больших объектов в PostgreSQL
Раздел: Базы данных (PostgreSQL)
pg_lo_unlink(PgSql\Connection $connection, int $oid): bool

Функция pg_lo_unlink() в PHP используется для удаления больших объектов (Large Objects) из базы данных PostgreSQL. Эти объекты хранятся отдельно от таблиц и управляются через специальный интерфейс.

Назначение функции

Функция применяется когда требуется удалить бинарные данные, такие как изображения, документы или медиафайлы, хранящиеся как большой объект. Она освобождает OID (идентификатор объекта) для повторного использования.

Аргументы функции
  • connection (обязательный с PHP 8.0) - ресурс подключения к PostgreSQL. Если не указан, используется последнее открытое соединение.
  • oid - целочисленный идентификатор большого объекта, который требуется удалить.
Примеры использования
Базовое удаление объекта
<?
$conn = pg_connect("dbname=test");
$oid = 12345;
$result = pg_lo_unlink($conn, $oid);
if ($result) {
    echo 'Объект удален';
} else {
    echo 'Ошибка удаления';
}
?>
Объект удален
Удаление с использованием последнего соединения
<?
pg_connect("dbname=test");
$oid = 54321;
// В PHP 8+ первый параметр обязателен
$result = pg_lo_unlink($oid);
var_dump($result);
?>
bool(true)
Альтернативные функции в PHP
pg_lo_import() и pg_lo_export()

Функции для импорта и экспорта больших объектов. Используются вместе с pg_lo_unlink() для полного цикла управления объектами.

Работа с типом bytea

Вместо больших объектов можно использовать тип данных bytea для хранения бинарных данных непосредственно в таблицах. Подход проще, но менее эффективен для очень больших файлов.

Удаление через SQL команду
<?
pg_query($conn, "SELECT lo_unlink(12345)");
?>

Прямой вызов функции базы данных lo_unlink через SQL запрос.

Аналоги в других языках
Python (psycopg2)
import psycopg2
conn = psycopg2.connect("dbname=test")
conn.cursor().execute("SELECT lo_unlink(12345)")
conn.commit()

В Python используется прямое SQL выполнение вместо отдельной функции.

Node.js (pg)
const { Client } = require('pg');
const client = new Client();
await client.connect();
await client.query('SELECT lo_unlink($1)', [12345]);

Аналогичный подход с параметризованными запросами.

Pg lo unlink в MySQL

MySQL не имеет прямой аналогии, так как использует другой подход к хранению больших бинарных данных (тип LONGBLOB в таблицах).

Типичные ошибки
Несуществующий OID
<?
$result = pg_lo_unlink($conn, 999999);
var_dump($result);
?>
bool(false)

Функция возвращает false при попытке удалить несуществующий объект.

Отсутствующее соединение в PHP 8
<?
$oid = 12345;
$result = pg_lo_unlink($oid);
?>
Fatal error: Uncaught ArgumentCountError: pg_lo_unlink() expects exactly 2 arguments, 1 given

В PHP 8.0 и выше оба аргумента стали обязательными.

Удаление уже удаленного объекта
<?
pg_lo_unlink($conn, $oid);
$result = pg_lo_unlink($conn, $oid);
var_dump($result);
?>
bool(false)
Изменения в версиях PHP
PHP 8.0

Параметр connection стал обязательным. Ранее можно было использовать последнее открытое соединение по умолчанию.

PHP 7.0

Улучшена обработка ошибок. При сбое теперь выбрасывается предупреждение.

Исторические изменения

До PHP 4.2.0 функция называлась pg_lounlink(). Старое имя сохранилось как псевдоним.

Расширенные примеры
Удаление с транзакцией
Пример php
<?
pg_query($conn, "BEGIN");
$oid = pg_lo_create($conn);
pg_lo_open($conn, $oid, "w");
// ... запись данных ...
pg_query($conn, "COMMIT");
// Удаление после использования
pg_lo_unlink($conn, $oid);
?>

Удаление объекта после завершения работы с ним в рамках транзакции.

Пакетное удаление устаревших объектов
Пример php
<?
$oids = [123, 456, 789];
foreach ($oids as $oid) {
    if (pg_lo_unlink($conn, $oid)) {
        echo "Удален объект $oid\n";
    }
}
?>
Удален объект 123
Удален объект 456
Объект 789 не найден
Интеграция с системой хранения
Пример php
<?
class LargeObjectManager {
    private $connection;
    
    public function delete($oid) {
        $result = pg_lo_unlink($this->connection, $oid);
        if (!$result) {
            throw new Exception("Не удалось удалить объект $oid");
        }
        return $result;
    }
}
?>

Обертка для безопасного удаления с обработкой ошибок.

PHP pg_lo_unlink function comments

En
Pg lo unlink Delete a large object