Bitte ertragen Sie mit mir, wie ich das Problem erkläre, wie ich versuchte, es zu lösen, und meine Frage, wie es zu verbessern ist, ist am Ende.Wie verwendet man SQLAlchemy, um eine SQL-Datei aus Abfrageausdrücken zum Masseneinfügen in ein DBMS auszugeben?
Ich habe eine 100.000 Zeilen CSV-Datei von einem Offline-Batch-Job, und ich musste fügen Sie es in die Datenbank als seine richtigen Modelle. Normalerweise, wenn dies eine ziemlich einfache Last ist, kann dies einfach geladen werden, indem man die CSV-Datei einfach an ein Schema anpasst; aber ich musste einige externe Verarbeitungen durchführen, die Abfragen erfordern, und es ist einfach viel bequemer, SQLAlchemy zu verwenden, um die Daten zu generieren, die ich möchte.
Die Daten, die ich hier haben möchte, sind 3 Modelle, die 3 vorhergehende Tabellen in der Datenbank darstellen und jedes nachfolgende Modell hängt vom vorherigen Modell ab. Zum Beispiel:
Model C --> Foreign Key --> Model B --> Foreign Key --> Model A
So müssen die Modelle in der Reihenfolge A, B und C. Ich kam mit einem Erzeuger/Verbraucher-Ansatz eingeführt werden bis:
- instantiate a multiprocessing.Process which contains a
threadpool of 50 persister threads that have a threadlocal
connection to a database
- read a line from the file using the csv DictReader
- enqueue the dictionary to the process, where each thread creates
the appropriate models by querying the right values and each
thread persists the models in the appropriate order
Das war schneller als ein non-threaded lesen/persist, aber es ist viel langsamer als Bulk-Laden einer Datei in die Datenbank. Die Arbeit endete persistent nach etwa 45 Minuten. Aus Spaß, entschied ich mich, es in SQL Aussagen schreiben, dauerte es 5 Minuten.
Das Schreiben der SQL-Anweisungen dauerte jedoch ein paar Stunden. Also meine Frage ist, könnte ich eine schnellere Methode verwendet, um Zeilen mit SQLAlchemy einfügen? Wie ich es verstehe, SQLAlchemy ist nicht für Massen-Operationen ausgelegt, so dass dies weniger als ideal ist.
Dies folgt auf meine Frage, gibt es eine Möglichkeit, die SQL-Anweisungen mit SQLAlchemy zu generieren, in einer Datei zu werfen, und dann einfach eine Massenladung in die Datenbank verwenden? I wissen über str (model_object), aber es zeigt nicht die interpolierten Werte.
Ich würde jede Anleitung schätzen, wie man das schneller macht.
Danke!
Haben Sie den Autocommit-Modus deaktiviert? Es wird in der Regel schneller, wenn Sie mehrere Zeilen einfügen und dann Commit statt nach jedem Einfügen committen. –