python loop SQLAlchemy, Datenbankinhalt löschen, aber das Schema nicht löschen




seaborn legend (3)

Ich entwickle eine Pylons-App, die auf der vorhandenen Datenbank basiert, also benutze ich Reflection. Ich habe eine SQL-Datei mit dem Schema, das ich zum Erstellen meiner Testdatenbank verwendet habe. Deshalb kann ich drop_all und create_all nicht einfach verwenden.

Ich möchte einige Komponententests schreiben und hatte das Problem, den Datenbankinhalt nach jedem Test zu löschen. Ich möchte nur alle Daten löschen, aber die Tabellen intakt lassen. Ist das möglich?

Die Anwendung verwendet Postgres und dies muss auch für die Tests verwendet werden.


Für PostgreSQL mit TRUNCATE :

with contextlib.closing(engine.connect()) as con:
    trans = con.begin()
    con.execute('TRUNCATE {} RESTART IDENTITY;'.format(
        ','.join(table.name 
                 for table in reversed(Base.metadata.sorted_tables))))
    trans.commit()

Hinweis: RESTART IDENTITY; stellt sicher, dass auch alle Sequenzen zurückgesetzt werden. Dies ist jedoch um 50% langsamer als das DELETE Rezept von @ aknuds1.

Ein anderes Rezept ist, alle Tabellen zuerst zu löschen und dann neu zu erstellen. Dies ist um weitere 50% langsamer:

Base.metadata.drop_all(bind=engine)
Base.metadata.create_all(bind=engine)


Ich habe in der SQLAlchemy-Google-Gruppe nach dem gleichen Thema gefragt, und ich habe ein Rezept erhalten, das anscheinend gut funktioniert (alle meine Tabellen werden geleert). Siehe den Thread als Referenz.

Mein Code (Auszug) sieht so aus:

import contextlib
from sqlalchemy import MetaData

meta = MetaData()

with contextlib.closing(engine.connect()) as con:
    trans = con.begin()
    for table in reversed(meta.sorted_tables):
        con.execute(table.delete())
    trans.commit()

Bearbeiten: Ich habe den Code geändert, um Tabellen in umgekehrter Reihenfolge zu löschen. angeblich sollte dies sicherstellen, dass Kinder vor den Eltern gelöscht werden.





pylons