Есть метод DataFrame.to_sql , но он работает только для баз данных mysql, sqlite и oracle. Я не могу перейти к этому методу postgres connection или sqlalchemy engine.
источник
Есть метод DataFrame.to_sql , но он работает только для баз данных mysql, sqlite и oracle. Я не могу перейти к этому методу postgres connection или sqlalchemy engine.
Начиная с pandas 0.14 (выпущен в конце мая 2014 г.), postgresql поддерживается. sql
Модуль теперь используется sqlalchemy
для поддержки различных вкусов базы данных. Вы можете передать движок sqlalchemy для базы данных postgresql (см. Документацию ). Например:
from sqlalchemy import create_engine
engine = create_engine('postgresql://scott:tiger@localhost:5432/mydatabase')
df.to_sql('table_name', engine)
Вы правы, что в пандах до версии 0.13.1 postgresql не поддерживался. Если вам нужно использовать старую версию pandas, вот исправленная версия pandas.io.sql
: https://gist.github.com/jorisvandenbossche/10841234 .
Я написал это некоторое время назад, поэтому не могу полностью гарантировать, что это всегда работает, но основа должна быть там). Если вы поместите этот файл в свой рабочий каталог и импортируете его, вы сможете сделать (где con
находится соединение postgresql):
import sql # the patched version (file is named sql.py)
sql.write_frame(df, 'table_name', con, flavor='postgresql')
Sqlalchemy engine
Могу ли я использовать существующееPostgres
соединение, созданное с помощью, вместо создания новогоpsycopg2.connect()
?Более быстрый вариант:
Следующий код скопирует ваш Pandas DF в базу данных postgres намного быстрее, чем метод df.to_sql, и вам не понадобится какой-либо промежуточный файл csv для хранения df.
Создайте движок на основе спецификаций вашей БД.
Создайте таблицу в своей базе данных postgres, которая имеет такое же количество столбцов, что и Dataframe (df).
Данные из DF будут вставлены в вашу таблицу postgres.
если вы хотите заменить таблицу, мы можем заменить ее обычным методом to_sql, используя заголовки из нашего df, а затем загрузить весь большой трудоемкий df в БД.
источник
contents
? Это должно быть то, что написаноcopy_from()
?contents
переменную, все остальное должно работать нормально,output.seek(0)
?Решение Pandas 0.24.0+
В Pandas 0.24.0 была представлена новая функция, специально разработанная для быстрой записи в Postgres. Вы можете узнать об этом больше здесь: https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-sql-method
источник
method='multi'
опция добавления выполняется достаточно быстро. Но да, этотCOPY
способ сейчас самый быстрый.with
это запись в буфер в памяти. В последней частиwith
используется оператор SQL и скорость copy_expert для массовой загрузки данных. С чего начинается средняя частьcolumns =
?keys
аргументы вpsql_insert_copy
функции? Как он получает какие-либо ключи и являются ли ключи просто именами столбцов?Table 'XYZ' already exists
. Насколько я понимаю, он не должен создавать таблицу?df.to_sql('table_name', engine, if_exists='replace', method=psql_insert_copy)
- это создает таблицу в вашей базе данных.Вот как я это сделал.
Это может быть быстрее, потому что он использует
execute_batch
:источник
Для Python 2.7 и Pandas 0.24.2 и с использованием Psycopg2
Модуль подключения Psycopg2
Подключиться к базе данных
Предполагая, что фрейм данных уже присутствует как df
источник