Pg lo create: примеры (PHP)
pg_lo_create(PgSql\Connection $connection, $object_id = ?): PgSql\Lob|string|int|falseФункция pg_lo_create в PHP предназначена для создания крупного объекта (Large Object, BLOB) в базе данных PostgreSQL. Она используется при необходимости хранения бинарных данных большого объема, таких как изображения, документы или медиафайлы, которые превышают стандартные ограничения типа bytea.
Синтаксис функции: pg_lo_create(resource $connection = ?, mixed $object_id = ?): int|false.
Аргументы:
- $connection (ресурс) – необязательный параметр. Ресурс соединения с базой данных PostgreSQL. Если не указан, используется соединение по умолчанию.
- $object_id (mixed) – необязательный параметр. Можно передать конкретный OID (идентификатор объекта), который должен быть назначен создаваемому крупному объекту. Если параметр не указан, сервер автоматически генерирует свободный OID.
Функция возвращает OID созданного крупного объекта или false в случае ошибки.
$conn = pg_connect("dbname=test user=postgres");
$oid = pg_lo_create($conn);
echo "Создан объект с OID: ".$oid;Создан объект с OID: 98765
$conn = pg_connect("dbname=test user=postgres");
$oid = pg_lo_create($conn, 123456);
if ($oid === false) {
echo "Не удалось создать объект с указанным OID.";
} else {
echo "Создан объект с OID: ".$oid;
}Создан объект с OID: 123456
Для работы с крупными объектами в PostgreSQL через PHP существует несколько функций:
- pg_lo_import() – создает крупный объект из файла в локальной файловой системе, возвращая его OID. Удобна для быстрой загрузки готовых файлов.
- pg_lo_open() – открывает существующий крупный объект для чтения или записи, возвращая ресурс объекта. Используется совместно с pg_lo_read, pg_lo_write.
Функцию pg_lo_create предпочтительнее использовать, когда требуется создать пустой объект для последующей потоковой записи данных, например, из сетевого источника. pg_lo_import удобнее для прямого импорта файлов с диска.
import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
conn.autocommit = True
lobj = conn.lobject(0, mode='w', oid=123456) # Создание с указанием OID
# или lobj = conn.lobject(0, mode='w') # Автогенерация OID
print(lobj.oid)123456
const { Client } = require('pg');
const client = new Client();
await client.connect();
const res = await client.query(
"SELECT lo_create($1)",
[123456] // null для автосоздания
);
console.log(res.rows[0].lo_create);123456
Pg lo create в MySQL
В MySQL нет прямого аналога. Для хранения больших бинарных данных используется тип LONGBLOB. Данные сохраняются напрямую в таблице, а не как отдельный объект с OID.
INSERT INTO files (name, data) VALUES (?, ?);// Расширение php-pgsql не установлено
$oid = pg_lo_create();Fatal error: Uncaught Error: Call to undefined function pg_lo_create()
Решение: Установить расширение pgsql и убедиться, что оно включено в php.ini.
$conn = pg_connect("dbname=test");
$oid1 = pg_lo_create($conn, 555);
// Попытка создать второй объект с тем же OID
$oid2 = pg_lo_create($conn, 555);
var_dump($oid2);bool(false)
Решение: Проверять возвращаемое значение функции или использовать автоматическую генерацию OID.
$conn = pg_connect("dbname=test");
pg_query($conn, "BEGIN");
$oid = pg_lo_create($conn);
pg_query($conn, "ROLLBACK"); // OID становится недействительным
pg_lo_open($conn, $oid, 'r');Warning: ... invalid large-object descriptor
В PHP 8.0 тип возвращаемого значения был уточнен. Теперь функция явно возвращает значение типа int|false. Ранее документация описывала возврат resource.
В PHP 8.1 и позднее не было внесено существенных изменений в поведение функции pg_lo_create. Однако рекомендуется использовать современный API PDO или, как минимум, проверять соединение, так как в будущих версиях поддержка ресурсов (resource) может быть сокращена.
$conn = pg_connect("dbname=test");
$oid = pg_lo_create($conn);
$handle = pg_lo_open($conn, $oid, 'w');
$data = 'Пример текстовых данных для записи в крупный объект.';
pg_lo_write($handle, $data);
pg_lo_close($handle);
echo "Записан объект OID: $oid";Записан объект OID: 98766
$conn = pg_connect("dbname=test");
$oid = pg_lo_create($conn);
// Сохраняем OID в таблице документов
pg_query($conn, "INSERT INTO documents (name, author, file_oid) VALUES ('report.pdf', 'Иванов', $oid)");
// Позже можно получить и прочитать объект
$result = pg_query($conn, "SELECT file_oid FROM documents WHERE name='report.pdf'");
$row = pg_fetch_assoc($result);
$readHandle = pg_lo_open($conn, $row['file_oid'], 'r');
$content = pg_lo_read($readHandle, 100);
echo "Первые 100 байт: ".bin2hex($content);$conn = pg_connect("dbname=test");
// Генерация случайных бинарных данных
$binaryData = random_bytes(1024);
$oid = pg_lo_create($conn);
$handle = pg_lo_open($conn, $oid, 'w');
// Запись строки бинарных данных
pg_lo_write($handle, $binaryData);
pg_lo_close($handle);
// Проверка размера через SQL
$res = pg_query($conn, "SELECT loread(...)"); // Используется функция loread
// В реальности размер можно получить через pg_lo_lseek
$handle = pg_lo_open($conn, $oid, 'r');
pg_lo_lseek($handle, 0, SEEK_END);
$size = pg_lo_tell($handle);
pg_lo_close($handle);
echo "Размер созданного объекта: $size байт";