2017-01-26 14 views
3

Интересно, как быстро записать данные из pandas DataFrame в таблицу в DB почтовых сообщений.Написать быстрый панда данных для postgres

1) Я попытался pandas.to_sql, но по какой-то причине он принимает объект, чтобы скопировать данные,

2) к тому же я попробовал следующее:

import io 
f = io.StringIO() 
pd.DataFrame({'a':[1,2], 'b':[3,4]}).to_csv(f) 
cursor = conn.cursor() 
cursor.execute('create table bbbb (a int, b int);COMMIT; ') 
cursor.copy_from(f, 'bbbb', columns=('a', 'b'), sep=',') 
cursor.execute("select * from bbbb;") 
a = cursor.fetchall() 
print(a) 
cursor.close() 

но он возвращает пустой список [].

У меня есть два вопроса: какой самый быстрый способ скопировать данные из кода python (dataframe) в postgres DB? и что было неправильным во втором подходе, который я пробовал?

ответ

5

Ваш второй подход должен быть очень быстрым.

Есть две проблемы с кодом:

  1. После записи CSV для f вы расположены в конце файла. Перед началом чтения вам нужно вернуть свою позицию в начало.
  2. При написании CSV, необходимо опустить заголовок и индекс

Вот что ваш окончательный код должен выглядеть следующим образом:

import io 
f = io.StringIO() 
pd.DataFrame({'a':[1,2], 'b':[3,4]}).to_csv(f, index=False, header=False) # removed header 
f.seek(0) # move position to beginning of file before reading 
cursor = conn.cursor() 
cursor.execute('create table bbbb (a int, b int);COMMIT; ') 
cursor.copy_from(f, 'bbbb', columns=('a', 'b'), sep=',') 
cursor.execute("select * from bbbb;") 
a = cursor.fetchall() 
print(a) 
cursor.close() 
+0

Я получаю следующий код ошибки: InternalError: текущая транзакция прерывается , команды, проигнорированные до конца транзакционного блока, - выглядят как некоторая sql-ошибка orr ??) –

+0

Вы находитесь в середине [транзакции] (https://www.postgresql.org/docs/current/static/tutorial-transactions. html), в котором была ошибка. Вам нужно сделать 'conn.rollback()', а затем 'conn.begin()' еще раз. – Michael

+0

Большое спасибо, но все же. DataError: дополнительные данные после последнего ожидаемого столбца CONTEXT: COPY bbbb, строка 1: «0,1,3» –

 Смежные вопросы

  • Нет связанных вопросов^_^