SQLAlchemy, Psycopg2 Postgresql KOPIEREN
Sieht es aus wie Psycopg hat einen benutzerdefinierten Befehl für die Ausführung eines KOPIEREN:
psycopg2 KOPIEREN mit cursor.copy_from() friert mit großen Eingängen
Gibt es eine Möglichkeit, den Zugriff auf diese Funktionalität aus mit SQLAlchemy?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es sieht nicht wie es.
Müssen Sie möglicherweise verwenden Sie einfach psycopg2 zu bewirken, dass diese Funktionalität und verzichten auf die ORM-Funktionen. Ich Schätze, dass ich nicht wirklich sehen, den nutzen von ORM in so einem Betrieb sowieso, da es ein straight bulk insert und der Umgang mit einzelnen Objekten a la ein ORM hätte wirklich nicht machen eine ganze Menge Sinn.
akzeptierte Antwort ist richtig, aber wenn Sie mehr wollen als nur die EoghanM Kommentar zu gehen Sie auf die folgenden bei mir funktioniert das Kopieren einer Tabelle aus CSV...
Den
sessionmaker
ist nicht notwendig, aber wenn Sie in die Gewohnheit zu schaffen, den Motor und die session gleichzeitig zu nutzenraw_connection
müssen Sie Sie trennen (es sei denn, es ist ein Weg, um den Zugang zum Motor über das session-Objekt, das weiß ich nicht). Der sql-string zur Verfügung gestelltcopy_expert
ist auch nicht der einzige Weg, um es, es ist eine grundlegendecopy_to
Funktion, die Sie verwenden können, mit der Teilmenge der Parameter, die Sie könnte die Vergangenheit zu einem normalenCOPY
Abfragen. Die Gesamtleistung der Befehl scheint schnell für mich, das kopieren aus einer Tabelle von ~20000 Zeilen.http://initd.org/psycopg/docs/cursor.html#cursor.copy_to
http://docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.Engine.raw_connection
fake_conn.commit()
am EndeWenn Ihr Motor so konfiguriert ist, mit einem psycopg2 connection-string (das ist der Standard, also entweder
"postgresql://..."
oder"postgresql+psycopg2://..."
), können Sie eine psycopg2 cursor aus einer SQL-Alchemie-session mitdie Sie verwenden können, um ausführen
Sich der cursor aktiv wird, in der gleichen Transaktion als session aktuell ist. Wenn ein
commit
oderrollback
passiert, jede weitere Verwendung der cursor mit werfenpsycopg2.InterfaceError
würden Sie haben, um eine neue zu erstellen.Können Sie verwenden:
Ich einfügen 200000 Zeilen in 5 Sekunden statt 4 Minuten
df
Objekt ist?pandas.DataFrame
hat einto_sql
- Methode, aber diese Methode hier nicht verwendet wird. Stattdessen werden dieto_csv
- Methode wird verwendet, um zu speicherndf
in einem in-memory-text-stream,output
, was dann passiert istpsycopg2
mitraw_connection
.CREATE TABLE ...
mit entsprechenden Spalten (oder fehlschlagen, wenn die Tabelle bereits vorhanden ist), aber Sie keine Daten.Brauchen Sie nicht um die drop-down, um psycopg2, verwenden Sie raw_connection noch ein cursor.
Führen Sie einfach das sql wie gewohnt, können Sie auch mit bind-Parameter mit
text()
:Drop können Sie die
execution_options(autocommit=True)
wenn diese PR akzeptiert werdenWenn Sie bekommen können, um den Motor haben Sie alles, was Sie brauchen, um dies zu tun:
Nun können Sie arbeiten.
Hier sind einige Vorlagen für die COPY-Anweisung zu verwenden, mit
cursor.copy_expert()
, der eine vollständige und flexible Möglichkeit, alscopy_from()
odercopy_to()
wie es hier angegeben: http://initd.org/psycopg/docs/cursor.html#cursor.copy_expert.Überprüfen Sie heraus, was die oben beschriebenen Optionen bedeuten und andere, die von Interesse sein können, auf Ihre spezifische situation https://www.postgresql.org/docs/current/static/sql-copy.html.
WICHTIGER HINWEIS: Der link zur Dokumentation der
cursor.copy_expert()
zeigt die Verwendung von STDOUT zu schreiben und in einer Datei von STDIN nach Kopie von einer Datei. Aber wenn man sich die syntax auf die PostgreSQL-Handbuch, werden Sie feststellen, dass Sie können auch angeben, in die Datei zu schreiben oder direkt in der COPY-Anweisung. Tun Sie das nicht, sind Sie wahrscheinlich nur Ihre Zeit verschwenden, wenn Sie nicht als root laufen (die läuft Python als root während der Entwicklung?) Nur tun, was angegeben ist in der psycopg2 die docs und geben STDIN oder STDOUT in Ihrer Aussage mitcursor.copy_expert()
, sollte es in Ordnung sein.