Ответ
В PostgreSQL большие объекты (LOB — Large OBjects) хранятся в специальной системной таблице pg_largeobject. Если размер данных превышает 2 КБ, PostgreSQL автоматически разбивает их на "чанки" (фрагменты) по 2 КБ и сохраняет их в этой таблице. Каждый чанк имеет уникальный идентификатор (LOID — Large Object ID), который связывает все фрагменты одного объекта.
Пример работы с большими объектами:
import (
"database/sql"
_ "github.com/lib/pq"
)
func storeLargeObject(db *sql.DB, data []byte) error {
tx, err := db.Begin()
if err != nil {
return err
}
lo := tx.QueryRow("SELECT lo_create(0)")
var oid int32
if err := lo.Scan(&oid); err != nil {
tx.Rollback()
return err
}
obj, err := tx.Exec("INSERT INTO pg_largeobject VALUES ($1, 0, $2)", oid, data)
// ...
return tx.Commit()
}
Для работы с LOB в PostgreSQL есть специальные функции: lo_create(), lo_import(), lo_export() и другие. В приложениях обычно используют эти функции или драйверы с поддержкой LOB.