Найти - Пользователи
Полная версия: Импорт данных в PostgreSQL
Начало » Базы данных » Импорт данных в PostgreSQL
1
Dr.Livsi
Доброго всем времени суток! Есть задача: ввести набор данных в PostgreSQL из dbf-файла. Возможные варианты решения:
1) прочитать содержимое dbf-файла, а затем - ввести в PgSQL с помощью команды “Insert into table (column1, column2, column1) values (%s, %s, %s)” % (dbfcolumn1, dbfcolumn2, dbfcolumn3) - этот вариант я знаю как сделать, но боюсь он самый медленный из всех.
2) преобразовать dbf-файл в бинарный файл, подходящий для команды copy from binary и затем втянуть его.
3) направить содержимое dbf-файла на STDOUT и прочитать его с помощью команды copy from stdin
Проблема заключается в том, что я не знаю как реализовать последние 2 варианта. Т.е. в первом варианте нужен какой-то код, который бы преобразовывал dbf-файл в бинарник для postgresql; во втором, нужен код, который будет отправлять содержимое dbf-файла на stdin для copy from. Помогите, пожалуйста, разобраться с этими вопросами.
Lexander
http://tinyurl.com/27wzdkl
Dr.Livsi
спасибо за ссылку :))) в общем-то мне нужен был dbf2pg для винды. На третий вопрос ответа не было ;) В общем-то с проблемой разобрался - наилучшее решение для меня будет copy from csv, а уж с csv проблем не будет.
Dr.Livsi
Снова возникла необходимость ввода и вывода данных в/из БД с помощью copy from stdin/copy to stdout. Подскажите, пожалуйста, как это можно реализовать? Хотя бы один коротенький пример даже без пояснений.
PooH
Dr.Livsi
Снова возникла необходимость ввода и вывода данных в/из БД с помощью copy from stdin/copy to stdout. Подскажите, пожалуйста, как это можно реализовать?
А pg_dump/psql чем вам не угодили?
Dr.Livsi
Собственно, расскажу для чего нужно.
Был компьютер А, на котором стоял postgresql-сервер и программа-клиент, написанная на python-e. Для подключения к БД используется psycopg2. Эта программа клиент передает на сервер запрос вида:
copy (select a,b,c,d,... from table1) to 'path/to/csvfile.csv'
with csv
header
delimiter as ';'
Сервер выполнял запросы и самостоятельно формировал csv-файлы по заданному пути.

Однако возникла необходимость поставить программу-клиент на несколько компьютеров. Получаем следующую систему: компьютер А-ubuntu server с PostgreSQL, и компьютеры B, C, D, E, находящиеся в домене windows, на которых стоит программа клиент. При передаче того же самого запроса возникает ошибка: сервер PostgreSQL уже не видит того пути, куда изначально все забрасывалось (он не включен в домен), он может забросить данные только на собственный диск.
Возникают несколько решений проблемы. Наиболее вероятные из них - это:
1)включить компьютер в домен виндоус (устанавливать дополнительные службы, конфигурировать, в общем, этот вариант пока представляется не самым лучшим.
2) скорректировать запросы следующим образом:
copy (select a,b,c,d,... from table1) to STDOUT
with csv
header
delimiter as ';'
при этом, программа-клиент должна каким-то образом (вот это я и хочу выяснить) принимать данные с STDOUT Postgre-сервера и писать их в соответствующий файл. Собственно, данное решение хорошо еще и тем, что copy to file можно осуществлять только суперпользователям, тогда как copy to STDOUT можно выполнять любому пользователю. Соответственно, данное решение более безопасно.
Dr.Livsi
гммм… вроде как нашел:
http://initd.org/psycopg/docs/cursor.html
если все получится - попозже выложу решение собственной задачи
Dr.Livsi
собственно, вот оно:
sql='''copy (select a,b,c,d,... from table1) to STDOUT
with csv
header
delimiter as ';'
'''
a=open('path/to/csvfile.csv')
cursor.copy_expert(sql, a)
a.close()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB