Этот вопрос не о байтее v. Oid v. Blobs v. Крупных объектах и т. Д.
У меня есть таблица, содержащая integer
поле первичного ключа и bytea
поле. Я хотел бы ввести данные в bytea
поле. Предположительно, это может быть сделано одним из PL/
языков, и я могу рассмотреть возможность сделать это PL/Python
в будущем.
Поскольку я все еще тестирую и экспериментирую, я просто хотел бы вставить данные из файла (на сервере), используя «стандартные» операторы SQL. Я знаю, что только администраторы с правами на запись на сервере смогут вставлять данные так, как мне бы хотелось. Я не обеспокоен этим на данном этапе, поскольку пользователи не будут вставлять bytea
данные в настоящее время. Я искал различные сайты StackExchange, архивы PostgreSQL и Интернет в целом, но не смог найти ответ.
Изменить: это обсуждение 2008 года подразумевает, что то, что я хочу сделать, невозможно. Как bytea
тогда используются поля?
Изменить: этот похожий вопрос от 2005 года остается без ответа.
Решено: подробности, представленные здесь на psycopg
сайте, послужили основой для решения, которое я написал на Python. Также возможно добавить двоичные данные в bytea
столбец, используя PL/Python
. Я не знаю, возможно ли это с использованием «чистого» SQL.
источник
blob
). Если это было ошибкой, я искренне извиняюсь.blob
это нормально, может быть неdatafile
имеет значенияОтветы:
как суперпользователь:
lo_get
был введен в 9.4, поэтому для более старых версий вам понадобится:тогда:
источник
Использование
pg_read_file('location_of file')::bytea
.Например,
Руководство по эксплуатации
источник
pg_read_binary_file('/path/to/file')
. См postgresql.org/docs/current/static/functions-admin.htmlЭто решение не совсем эффективно с точки зрения времени выполнения, но тривиально просто по сравнению с созданием собственных заголовков для
COPY BINARY
. Кроме того, не требуется никаких библиотек или языков сценариев за пределами bash.Сначала преобразуйте файл в hexdump, удвоив размер файла.
xxd -p
сближает нас, но добавляет некоторые раздражающие строки, о которых мы должны позаботиться:Затем импортируйте данные в PostgreSQL как очень большое
text
поле. Этот тип содержит до одного ГБ на каждое значение поля, поэтому в большинстве случаев мы должны быть в порядке:Теперь, когда наши данные представляют собой безвозмездно большую шестнадцатеричную строку, мы используем PostgresQL,
decode
чтобы получить их в видеbytea
:источник
tr -d '\n'
работает на выходе xxd, который кодирует двоичное содержимое ввода в виде шестнадцатеричных символов ASCII (0-9 и af). xxd также происходит с выходными переводами строки через равные промежутки времени, чтобы сделать вывод понятным для человека, но в этом случае мы хотим, чтобы они были удалены. Перевод строки в исходных данных будет в шестнадцатеричной форме и останется неизменным.Ответ с XXD хорош и для маленьких файлов, очень быстро. Ниже приведен пример сценария, который я использую.
источник
Используйте функцию Postgres COPY BINARY . Это в целом эквивалентно внешним таблицам Oracle .
источник
bytea
столбец?