Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 6, 2010 23:28:52

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

Импорт данных в PostgreSQL

Доброго всем времени суток! Есть задача: ввести набор данных в 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. Помогите, пожалуйста, разобраться с этими вопросами.



Офлайн

#2 Окт. 7, 2010 01:23:36

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Импорт данных в PostgreSQL

Офлайн

#3 Окт. 10, 2010 22:07:22

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

Импорт данных в PostgreSQL

спасибо за ссылку :))) в общем-то мне нужен был dbf2pg для винды. На третий вопрос ответа не было ;) В общем-то с проблемой разобрался - наилучшее решение для меня будет copy from csv, а уж с csv проблем не будет.



Офлайн

#4 Фев. 15, 2011 08:06:59

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

Импорт данных в PostgreSQL

Снова возникла необходимость ввода и вывода данных в/из БД с помощью copy from stdin/copy to stdout. Подскажите, пожалуйста, как это можно реализовать? Хотя бы один коротенький пример даже без пояснений.



Офлайн

#5 Фев. 15, 2011 08:35:47

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Импорт данных в PostgreSQL

Dr.Livsi
Снова возникла необходимость ввода и вывода данных в/из БД с помощью copy from stdin/copy to stdout. Подскажите, пожалуйста, как это можно реализовать?
А pg_dump/psql чем вам не угодили?



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#6 Фев. 15, 2011 22:14:34

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

Импорт данных в PostgreSQL

Собственно, расскажу для чего нужно.
Был компьютер А, на котором стоял 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 можно выполнять любому пользователю. Соответственно, данное решение более безопасно.



Офлайн

#7 Фев. 16, 2011 13:43:48

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

Импорт данных в PostgreSQL

гммм… вроде как нашел:
http://initd.org/psycopg/docs/cursor.html
если все получится - попозже выложу решение собственной задачи



Офлайн

#8 Фев. 16, 2011 21:21:54

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

Импорт данных в PostgreSQL

собственно, вот оно:

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()



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version