Ich verwende Flask-SQLAlchemy, um eine ziemlich große Masseninsertion von 60.000 Zeilen zu machen. Ich habe auch eine Viele-zu-Viele-Beziehung in dieser Tabelle, daher kann ich db.engine.execute
nicht dafür verwenden. Vor dem Einfügen muss ich ähnliche Elemente in der Datenbank suchen und die Einfügung in ein Update ändern, wenn ein doppelt vorhandenes Element gefunden wird.
Ich könnte dies vorher tun und dann eine Masseneinfügung über db.engine.execute
machen, aber ich brauche den Primärschlüssel der Zeile beim Einfügen.
Momentan mache ich einen db.session.add()
und db.session.commit()
auf jedem Insert, und ich bekomme mickrige 3-4 Inserts pro Sekunde.
Ich habe einen Profiler ausgeführt, um zu sehen, wo der Engpass ist, und es scheint, dass die db.session.commit()
60% der Zeit beansprucht.
Gibt es einen Weg, der es mir erlauben würde, diese Operation schneller zu machen, vielleicht durch das Gruppieren von Commits, die mir aber Primärschlüssel zurückgeben würde?
So sehen meine Modelle aus:
%Vor%Meine Einfügeoperation wird wie folgt ausgeführt:
%Vor% Vielleicht sollten Sie versuchen, db.session.flush()
zu senden, um die Daten an den Server zu senden, was bedeutet, dass alle Primärschlüssel generiert werden. Am Ende können Sie db.session.commit()
, um die Transaktion tatsächlich zu committen.
Ich benutze den folgenden Code, um den Inhalt eines Pandas DataFrame schnell in SQLite zu lesen. Beachten Sie, dass die ORM-Funktionen von SQLAlchemy umgangen werden. myClass in diesem Kontext ist eine von db.Model abgeleitete Klasse, der ein Tabellenname zugewiesen ist. Wie die Code-Schnipsel erwähnen, habe ich
angepasst %Vor%Tags und Links python sqlalchemy flask flask-sqlalchemy