Es gibt die DataFrame.to_sql- Methode, die jedoch nur für MySQL-, SQLite- und Oracle-Datenbanken funktioniert. Ich kann nicht auf diese Methode Postgres Verbindung oder SQLalchemy Engine übergeben.
quelle
Es gibt die DataFrame.to_sql- Methode, die jedoch nur für MySQL-, SQLite- und Oracle-Datenbanken funktioniert. Ich kann nicht auf diese Methode Postgres Verbindung oder SQLalchemy Engine übergeben.
Ab pandas 0.14 (veröffentlicht Ende Mai 2014) wird postgresql unterstützt. Das sql
Modul unterstützt jetzt sqlalchemy
verschiedene Datenbankvarianten. Sie können eine SQLalchemy-Engine für eine PostgresQL-Datenbank übergeben (siehe Dokumente ). Z.B:
from sqlalchemy import create_engine
engine = create_engine('postgresql://scott:tiger@localhost:5432/mydatabase')
df.to_sql('table_name', engine)
Sie haben Recht, dass in Pandas bis Version 0.13.1 postgresql nicht unterstützt wurde. Wenn Sie eine ältere Version von Pandas verwenden müssen, finden Sie hier eine gepatchte Version von pandas.io.sql
: https://gist.github.com/jorisvandenbossche/10841234 .
Ich habe dies vor einiger Zeit geschrieben, kann also nicht vollständig garantieren, dass es immer funktioniert, aber die Basis sollte da sein. Wenn Sie diese Datei in Ihr Arbeitsverzeichnis con
einfügen und importieren, sollten Sie in der Lage sein (wo ist eine Postgresql-Verbindung):
import sql # the patched version (file is named sql.py)
sql.write_frame(df, 'table_name', con, flavor='postgresql')
Sqlalchemy engine
Kann ich eine neuePostgres
Verbindung verwenden, die mit erstellt wurde, anstatt eine neue zu erstellenpsycopg2.connect()
?Schnellere Option:
Mit dem folgenden Code wird Ihr Pandas DF viel schneller als mit der Methode df.to_sql in die Postgres-Datenbank kopiert, und Sie benötigen keine Zwischen-CSV-Datei, um die df zu speichern.
Erstellen Sie eine Engine basierend auf Ihren DB-Spezifikationen.
Erstellen Sie in Ihrer Postgres-Datenbank eine Tabelle mit der gleichen Anzahl von Spalten wie der Datenrahmen (df).
Daten in DF werden in Ihre Postgres-Tabelle eingefügt .
Wenn Sie die Tabelle ersetzen möchten, können wir sie durch die normale to_sql-Methode ersetzen, indem wir Header aus unserem df verwenden und dann den gesamten zeitaufwändigen df in die DB laden.
quelle
contents
? Sollte dies derjenige sein, in dem geschrieben stehtcopy_from()
?contents
Variable, alles andere sollte gut funktionierenoutput.seek(0)
?Pandas 0.24.0+ Lösung
In Pandas 0.24.0 wurde eine neue Funktion eingeführt, die speziell für schnelles Schreiben in Postgres entwickelt wurde. Weitere Informationen finden Sie hier: https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-sql-method
quelle
method='multi'
Option zum Hinzufügen schnell genug. Aber ja, dieseCOPY
Methode ist momentan der schnellste.with
schreibt in einen In-Memory-Puffer. Der letzte Teil vonwith
besteht darin, eine SQL-Anweisung zu verwenden und die Geschwindigkeit von copy_expert zu nutzen, um die Daten in großen Mengen zu laden. Was ist der mittlere Teil, der damit beginntcolumns =
?keys
Argumente in derpsql_insert_copy
Funktion erklären ? Wie bekommt es irgendwelche Schlüssel und sind die Schlüssel nur die Spaltennamen?Table 'XYZ' already exists
. Soweit ich weiß, sollte es keine Tabelle erstellen, oder?df.to_sql('table_name', engine, if_exists='replace', method=psql_insert_copy)
- dies erstellt eine Tabelle in Ihrer Datenbank.So habe ich es gemacht.
Es kann schneller sein, weil es verwendet
execute_batch
:quelle
Für Python 2.7 und Pandas 0.24.2 und mit Psycopg2
Psycopg2-Verbindungsmodul
Stellen Sie eine Verbindung zur Datenbank her
Angenommen, der Datenrahmen ist bereits als df vorhanden
quelle