2012-06-27 12 views
19

Ich benutze SQlAlchemy. Ich möchte alle Datensätze löschen, die effizient in der Datenbank vorhanden sind, aber ich möchte die Tabelle/Datenbank nicht löschen.Wie bereinigt man die Datenbank, indem man alle Datensätze mit sqlalchemy löscht?

Ich versuchte mit dem folgenden Code.

Es scheint, es ist nicht die sehr effiziente, da ich über alle Tabellen in der Datenbank iterieren. Kann mir jemand die bessere und effizientere Methode vorschlagen?

Jede Art von Hilfe, die hier sehr geschätzt wird.

+0

Für einige Datenbanken existiert Aussage 'gestutzt'. Es erstellt Tabellen neu und arbeitet schneller und nicht transaktional. Sie können es mit rohen SQL mit engine.execute ausführen ('' 'truncate tablename' '') – varela

+0

@Varela Danke für Ihre Gedanken teilen Ich möchte die Methode/Funktion so schreiben, dass es auf allen Datenbanken funktionieren sollte. Da 'truncate' DB-abhängig ist, wäre es nicht meine erste Wahl. – Rakesh

+1

Dann gibt es nichts Besseres, Sie können es nicht auslassen, durch Tabellen zu iterieren und wahrscheinlich die einzige Anweisung zu löschen, die für alle DBs funktioniert. – varela

Antwort

22

Wenn sich Modelle auf das vorhandene DB-Schema stützen (normalerweise autoload=True), können Sie nicht vermeiden, Daten in jeder Tabelle zu löschen. MetaData.sorted_tables ist praktisch:

for tbl in reversed(meta.sorted_tables): 
    engine.execute(tbl.delete()) 

Wenn Ihre Modelle das komplette Schema tun definieren, gibt es nichts einfacher als drop_all/create_all (wie bereits von @ jadkik94 hingewiesen).

Weiter würde TRUNCATE sowieso nicht auf den Tischen arbeiten, die durch ForeignKeys referenziert werden, welche die Verwendung erheblich einschränkt.

+0

Hallo. Meine 'meta.tables' oder' meta.sorted_tables' sind aus irgendeinem Grund eine leere Liste. Ich habe 'meta = sqlalchemy.MetaData (bind = engine)'. Warum zeigt es leer während die Datenbank Tabellen enthält? –

+1

Wenn Sie keine definierten Modelle an dieses "Meta" gebunden haben, gibt es nichts. Wenn Sie jedoch keine Modelle definieren und diese aus der Datenbank "reflektieren" möchten, müssen Sie ['MetaData.reflect'] aufrufen (http://docs.sqlalchemy.org/en/rel_0_7/core/ schema.html # sqlalchemy.schema.MetaData.reflect) zuerst – van

+0

Wow, danke für deine Hilfe! Nur noch eine Frage, wenn es Ihnen nichts ausmacht. Um die Tabelleninstanz zu bekommen, kann ich 'meta.tables ['tasks']' 'machen, aber das bedeutet, dass ich mich an den Klassennamen (' Tasks') und den Tabellennamen 'taskes' erinnern muss. Gibt es eine Möglichkeit, das zu vermeiden? –

7

Für mich tbl.drop(engine) setzen gearbeitet, aber nicht engine.execute(tbl.delete())

SQLAlchemy 0.8.0b2 und Python 2.7.3

Verwandte Themen