Внести значение для поля bitea в таблицу

Игорь

Новичок
Внести значение для поля bitea в таблицу

Здравствуйте.

Стоит задача внести некий массив данных в поле типа bitea.

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

Есть ли иные пути решения задачи, без записи данных в файл? Все данные представляют собой текст. Стоит ли уйти от использования bitea в пользу text?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Сравнение типов bytea и text не совсем адекватно, т.к. используется для разных целей. Выбор зависит от структуры данных и способов их использования.

При чем тут large object - вообще непонятно.

>Есть ли иные пути решения задачи, без записи данных в файл?
Откуда данные вообще берутся?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: Игорь
Здравствуйте.

Стоит задача внести некий массив данных в поле типа bitea.

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

Есть ли иные пути решения задачи, без записи данных в файл? Все данные представляют собой текст. Стоит ли уйти от использования bitea в пользу text?
Каждая фраза по отдельности вроде понятна, всё вместе --- бессвязный бред. Судя по ошибке в названии типа bytea эффект вызван недостаточным знакомством с документацией.
 

Игорь

Новичок
Upd: задание несколько изменилось.

Есть таблица, в которую нужно занести ФАЙЛ неизвестной длинны. Предполагаемые объёмы -- 10 - 15 Мб.

Для этого в таблице предусмотрено поле, типа bytea.

Данные для этого поля генерируются скриптом. И эти данные можно представить как набор строк. Строки пишутся в файл. Затем файл архивируется. После чего этот файл нужно поместить в таблицу.

Вопрос: как вставить полученный файл в таблицу.
 

sayber

Новичок
а файловую систему уже не модно для этого использовать?
 

Игорь

Новичок
Файловая система в данном случае не подходит. Ибо придётся либо расшаривать ресурс, либо поднимать ftp сервер. Ни то ни другое реализовано не будет.
 

sayber

Новичок
В конечном итоге файл же будет отдаваться скриптом? Так не проще ли читать файл с диска?
 

Игорь

Новичок
В конечном итоге файл будет получен программой, написанной на Delphi, которая прекрасно работает с блобами. И диск с файлом территориально будет находится за тридяветь земель. И никаких иных служб, кроме РСУБД, в сеть смотреть не будет.

-~{}~ 08.05.07 10:00:

Вот это работает (правда пока не архивирую zip)
PHP:
$sql = "insert into gps.ref_scripts (prov_id, counters_full) values (".$rkc_id.",
'".pg_escape_bytea(file_get_contents($prov_path."fulldump.sql"))."')";
pg_query($sql);
 

Игорь

Новичок
Видите ли, порою общение с коллегами приводит к скорейшему результату. Для примера, дока на постгрес весит 1688 страниц.

А людям бывает нужно сделать небольшой пустячок, из смежной области. И читать тонны литературы -- не самый разумный способ потратить время.

Чтож вы, милый человек, не бросили мне пару строк кода? И не помогли мне сэкономить несколько часов жизни?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Да потому что исходный вопрос так задан, что на него отвечать слишком долго. Пришлось бы объяснять, чем отличаются поля bytea и large object'ы, для которых работает lo_import; когда уместо использовать bytea, а когда --- text.

А вот на короткий вопрос "как вставить данные в поле типа bytea" можно было бы ответить одной строкой: "командой insert, предварительно обработав содержимое поля функцией pg_escape_bytea()".

Так что тренируйся в задании вопросов, а то придётся читать все тыщи страниц.
 

Игорь

Новичок
Ну когда использовать bytea и text понятно, а вот кто такие large object'ы пока не очень.

И ещё вопрос. В данном случае, получается, что я передаю огромные, длиннющие строки, метров на 10-15.

Возникают вопросы:
Как переваривает PHP строки такой длинны?
Как переваривает PostgreSQL строки такой длинны?

Правильно ли я понимаю, что память под PHP процесс должна быть выделена заранее большого объёма, чтобы было место для строки длинной в 15 Мб?

Не рациональнее ли при этом использовать эти самые large object'ы, которые можно прочитать из файловой системы сервера?

Файлы для large objects должны лежать на сервере баз данных? Т.к. вебсервер и сервер бызы данных -- физически разные машины.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: Игорь
И ещё вопрос. В данном случае, получается, что я передаю огромные, длиннющие строки, метров на 10-15.

Возникают вопросы:
Как переваривает PHP строки такой длинны?
Нормально, если разрешить ему выделять необходимую память.
Как переваривает PostgreSQL строки такой длинны?
Нормально.
Правильно ли я понимаю, что память под PHP процесс должна быть выделена заранее большого объёма, чтобы было место для строки длинной в 15 Мб?
Нет, заранее память не выделяется, только когда понадобится место для строки.
Не рациональнее ли при этом использовать эти самые large object'ы, которые можно прочитать из файловой системы сервера?

Файлы для large objects должны лежать на сервере баз данных? Т.к. вебсервер и сервер бызы данных -- физически разные машины.
У large object'ов основное достоинство --- возможность работы как с файлами (то есть чтения по частям и т.п.). Из-за 10-15 мегабайт я бы не парился, вот при сотне-другой уже можно начинать.

Файлы могут лежать где угодно, просто есть серверная функция lo_import, которая работает с файловой системой сервера БД, и клиентская [m]pg_lo_import[/m], которая работает соответственно с файловой системой вебсервера. Но на самом деле наличие файла необязательно, можно писать данные при помощи [m]pg_lo_write[/m], беря их из любого источника.
 
Сверху