Как хранить файлы в postgresql
3 года назад
Nikolai Gagarinov
Ответы
В PostgreSQL файлы можно хранить двумя основными способами: в виде больших объектов (BLOBs) или в виде бинарных данных в столбцах таблиц.
-
Хранение файлов как больших объектов (BLOBs):
Для хранения файлов в виде больших объектов в PostgreSQL используется тип данных
bytea. Чтобы сохранить файл как BLOB, сначала нужно преобразовать его в массив байт, а затем вставить массив байт в таблицу в столбец типаbytea.Пример создания таблицы для хранения BLOBs:
Пример добавления BLOB в таблицу:
Для получения BLOB из таблицы и обратного преобразования в файл можно использовать SQL-запросы в функциях или приложениях, работающих с базой данных.
-
Хранение файлов как бинарных данных в столбцах таблиц:
Вместо хранения файлов в виде BLOBs, файлы можно сохранять в столбцы таблицы в формате
byteaили других типов данных, таких какtextилиvarchar. Однако, этот способ не рекомендуется для хранения больших файлов, так как это может привести к увеличению размера базы данных и ухудшению производительности.Пример создания таблицы для хранения файлов как бинарных данных:
Пример добавления файла в таблицу:
Для работы с файлами в виде бинарных данных в столбцах таблицы также можно использовать SQL-запросы и функции.
В обоих случаях важно учитывать размеры файлов, требования к производительности и обработке данных при выборе способа хранения файлов в PostgreSQL.
3 года назад
Olga Pejenkova
Чаще всего файлы в PostgreSQL не кладут. Файл хранят на диске или в объектном хранилище — S3, Yandex Object Storage, MinIO, — а в таблицу записывают путь и метаданные:
Почему так делают:
- база растёт медленнее, резервные копии делаются быстрее;
- файлы отдаёт веб-сервер или CDN, приложение и база не нагружаются;
- хранилище дешевле дискового места базы.
Если файлы нужно хранить в базе
Подходит для небольших файлов — аватаров, подписей, документов до нескольких мегабайт, — когда важно, чтобы файл и запись менялись в одной транзакции.
Тип bytea
Бинарные данные в обычном столбце:
Записывают файл из приложения параметром запроса. На Python с psycopg:
Предел одного значения bytea — 1 ГБ, но файлы больше десятков мегабайт так хранить неудобно: запрос целиком читает файл в память.
Large Objects
Механизм больших объектов хранит файлы до 4 ТБ и читает их частями. В таблице лежит только идентификатор объекта типа oid. Минус: при удалении строки объект не удаляется сам, его нужно стирать функцией lo_unlink(), иначе база копит мусор.
Что выбрать
Проектирование таблиц и типы данных разбирают в курсе «SQL для разработчиков».
7 дней назад
Никита Вихров






