Функция для добавления к 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;