Функция для добавления к blob bytea в postgresql

Я загружаю большое количество файлов (двоичные данные) в базу данных Postgres (файлы хранятся в виде BLOB-объектов в БД).

Одним из способов, который я нашел, было использование больших объектов, которое прекрасно работает. Однако по разным причинам я хотел бы изучить возможность хранения содержимого файла непосредственно в поле bytea. Теперь менеджеры больших объектов позволяют мне напрямую записывать куски байтов непосредственно в его буфер, избавляя от необходимости сначала загружать весь файл в память.

Это довольно важно для меня, так как я загружаю файлы с несколькими потоками, работающими параллельно (и сборщик мусора просто не может идти в ногу, если все потоки одновременно загружают целые файлы в память).

Есть ли способ сделать это с помощью параметра bytea? Я думал о функции SQL, которая добавляет кусок байтов к полю байтов строки. Тогда я могу просто вызвать эту функцию несколько раз для BLOB-объекта. Я довольно новичок в PostgreSQL, поэтому я действительно мог сделать подсказку, как может выглядеть такая функция SQL.

Итак, как мне добавить байт-блоб в PostgreSQL?

Кстати, альтернативные идеи также приветствуются.

Я использую PostgreSQL 9.3, C# (.NET 4) и провайдера NpgSql Postgres Data, файлы (большие двоичные объекты) могут быть от нескольких килобайт до нескольких мегабайт.

Изменить: я видел ссылки на byteacat функция, кажется многообещающей, но я не могу найти пример того, как я должен ее использовать.

Edit2: В конце концов, кажется, что проще всего просто загружать большие двоичные объекты как отдельные параметры в запросе... при условии, что они достаточно быстро собирают мусор (например, не делают байтовые массивы свойством объект). Postgresql обрабатывает данные очень хорошо!

1 ответ

Редактировать: Даниэль Верите прав, это становится грязным (и через некоторое время сильно замедляется), я бы не рекомендовал этот путь.

Хорошо, это было действительно просто:

Существует || оператор, который добавляет двоичные данные... примеры:

UPDATE TableWithBlob SET blob = blob || E'123\\000456' WHERE id = 'a356211f-1cb7-436d-80a8-7e608ffds0';

Или как параметризованный SQL-запрос (при использовании провайдера данных NpgSQL):

UPDATE TableWithBlob SET blob = blob || @Data WHERE ID = @ID;
Другие вопросы по тегам