powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / вставка файла в blob
14 сообщений из 14, страница 1 из 1
вставка файла в blob
    #35294606
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
create table test(data bytea);
Как можно командой psql вставить бинарный файл в базу?
Вижу примеры для \copy и вставки csv файлов, но что делать для бинарного..

Что типа:
psql.exe -c "insert into test(data) values (lo_import('c:\temp\OrderConfirmation.bin'))"
...
Рейтинг: 0 / 0
вставка файла в blob
    #35294634
Ega
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю, что для lo_import у тебя тип данных должен быть lo (и модуль при установке должен был быть включен)
...
Рейтинг: 0 / 0
вставка файла в blob
    #35295062
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прежде всего, я не понимаю синтаксиса \copy, когда надо копировать BLOB, а не CSV разобрать по столбцам.
...
Рейтинг: 0 / 0
вставка файла в blob
    #35297861
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
\copy для blob не используется
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
postgres=# \?
...
Copy, Large Object
  \copy ...      выполнить SQL COPY на стороне клиента
  \lo_export LOBOID FILE
  \lo_import FILE [COMMENT]
  \lo_list
  \lo_unlink LOBOID    операции над большими объектами
вам нужны \lo_* команды
...
Рейтинг: 0 / 0
вставка файла в blob
    #35298019
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st_serg
вам нужны \lo_* команды

именно так я и пытался:
Код: plaintext
1.
psql.exe -c "insert into test(odata) values (lo_import('OrderConfirmation.jrxml'))"
ERROR: could not open server file "OrderConfirmation.jrxml": No such file or directory

Постгрес ожидает получить файл на серверной файловой системе, а я хочу передать его с клиента.

При импользовани \copy имеется возможность получить файл со stdin.

Есть идеи?
...
Рейтинг: 0 / 0
вставка файла в blob
    #35298647
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
\lo_import file и sql select lo_import('file') - это разные команды. первая выполняется клиентом, вторая - сервером. насчёт bytea - просто нужно бинарные данные проэскейпить в вид \000\001 и т.д. и передать это в виде строки в sql команду или в \copy


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
вставка файла в blob
    #35298658
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скрипт на перле эскейпующий пишется за три секунды (ну хорошо, за четыре :))
Код: plaintext
perl -e 'while($c = getc) { printf ("\\\\%03o", ord($c)); }'
два слеша в выводе нужно что бы постгресовский парсер не пропарсил их обратно при передаче в виде строки. для copy двух слешей в выводе не нужно имхо, достаточно одного.


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
вставка файла в blob
    #35299344
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бог с ним кодированием, у меня даже не выходит вставить текстовый файл с клиента в поле text.

Т.е. с синтаксисом \copy не могу разобраться.
...
Рейтинг: 0 / 0
вставка файла в blob
    #35299594
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadminбог с ним кодированием, у меня даже не выходит вставить текстовый файл с клиента в поле text.

Т.е. с синтаксисом \copy не могу разобраться.эээ как это "бог с ним" ? :)
если в файле есть спец символы например перевод строки, то он и не вставится - перевод строки в copy означает новую запись в базе. так что его и другие подобные символы нужно превращать в их код типа \012
...
Рейтинг: 0 / 0
вставка файла в blob
    #35299670
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёш
если в файле есть спец символы например перевод строки, то он и не вставится - перевод строки в copy означает новую запись в базе. так что его и другие подобные символы нужно превращать в их код типа \012
Если бы я увидел эту проблему, то был бы наполовину счастлив -)
Пока что я даже не могу заставить psql брать файл с локальной машины.
...
Рейтинг: 0 / 0
вставка файла в blob
    #35299675
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
seb=> create table test_copy_text (val1 text, val2 text);
CREATE TABLE
seb=> \q
seb@seb:/tmp/sss$ psql -c 'copy test_copy_text from stdin;'
Введите данные для копирования с последующим символом новой строки (newline).
Закончите ввод данных строкой '\.'.
>> эта строка попадёт в первую запись в поле val1       это следующее поле val2 (через символ таба)
>> эта строка попадёт во вторую запись в поле val1      это следующее поле val2 (через символ таба)\012а это новая строка в том же поле val2 (\\ 012  код перевода строки)
>> \.
seb@seb:/tmp/sss$ psql -c 'select * from test_copy_text'
                      val1                       |                               val2
-------------------------------------------------+------------------------------------------------------------------
 эта строка попадёт в первую запись в поле val1  | это следующее поле val2 (через символ таба)
 эта строка попадёт во вторую запись в поле val1 | это следующее поле val2 (через символ таба)
                                                 : а это новая строка в том же поле val2 (\ 012  код перевода строки)
( 2  rows)


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
вставка файла в blob
    #35299690
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadminПока что я даже не могу заставить psql брать файл с локальной машины.copy не может загрузить обычный файл, символ таба используется для разделения полей, а символ перевода строки - для разделения записей, то есть как минимум - эти символы нужно превратить в их коды.
...
Рейтинг: 0 / 0
вставка файла в blob
    #35299723
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с файлом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
seb@seb:/tmp/sss$ psql -c "\copy test_copy_text from 'copy.txt'"
seb@seb:/tmp/sss$ psql -c 'select * from test_copy_text'
                      val1                       |                               val2
-------------------------------------------------+------------------------------------------------------------------
 эта строка попадёт в первую запись в поле val1  | это следующее поле val2 (через символ таба)
 эта строка попадёт во вторую запись в поле val1 | это следующее поле val2 (через символ таба)
                                                 : а это новая строка в том же поле val2 (\ 012  код перевода строки)
( 2  rows)

seb@seb:/tmp/sss$ cat copy.txt
эта строка попадёт в первую запись в поле val1  это следующее поле val2 (через символ таба)
эта строка попадёт во вторую запись в поле val1 это следующее поле val2 (через символ таба)\012а это новая строка в том же поле val2 (\\ 012  код перевода строки)
\.
содержимое copy.txt аналогично тому что я вводил вручную. команду sql copy сдесь использовать нельзя потому что она выполняется на стороне сервера и будет пытатся загрузить файл на сервере. поэтому тут используется команда клиента psql - \copy


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
вставка файла в blob
    #35482785
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как записать файл в поле bytea из-под windows, не используя perl или сторонние библиотеки

в командный файл написать
Код: plaintext
1.
2.
3.
4.
FOR /F "tokens=1,2" %%i IN ('psql -c "\lo_import filename.xml" ') DO set OID=%%j
REM в базе создается BLOB, psql возвращает строку, где второе поле - OID 
REM мы сохраняем его в переменной OID
psql -c "select insert into mytable(Bytea_Data)  values(Oid2Bytea(%OID%) );"
REM а теперь вставляем в поле Bytea_Data, сконвертировав функцией Oid2Bytea(OID)

Функция:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create or replace function Oid2Bytea(
                             in_OID             int
                           ) returns bytea as $$
declare
m_record  record;
m_data  bytea:='';
begin

for m_record in 
    select  data
    FROM pg_largeobject WHERE loid = in_OID
loop
   m_data := m_data || m_record.data;
end loop;
return m_data;

end;
$$ language 'plpgsql' security definer;


Готовый скрипт .cmd для windows
Код: plaintext
1.
2.
3.
4.
5.
6.
rem cls
set fname=% 1 
set psql_exe=psql.exe  -c
set psql_cmd=%psql_exe%"\lo_import %fname%;"

FOR /F "tokens=1,2" %%i IN ('%psql_cmd%') DO set OID=%%j
%psql_exe%"select insert into mytable(Bytea_Data)  values(system.Oid2Bytea(%OID%) );"
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / вставка файла в blob
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]