2009-05-15 2 views
7

Angenommen, ich habe ein engine auf die MySQL-Datenbank:Wie generiert man eine Datei mit DDL im SQL-Dialekt der Engine in SQLAlchemy?

engine = create_engine('mysql://arthurdent:[email protected]/dtdb', echo=True) 

Ich kann dtdb mit Tabellen, FKs usw. füllen von:

metadata.create_all(engine) 

Gibt es eine einfache Möglichkeit, die SQL-Datei zu generieren, die alle enthält die DDL-Anweisungen, anstatt diese DDL-Anweisungen tatsächlich auf dtdb anzuwenden?

Bisher habe ich auf die Erfassung der von echo=True erzeugten SQLAlchemy-Log-Ausgabe zurückgegriffen und sie von Hand bearbeitet. Aber das ist einfach zu schmerzhaft.

Es sieht so aus, als hätte SA eine ziemlich ausgeklügelte Schema-Management-API, aber ich habe keine Beispiele gesehen, wie man einfach die Schema-Definitionen als Text streamt.

Antwort

13

Die schnelle Antwort ist in der SQLAlchemy 0.8 FAQ.

In SQLAlchemy 0.8 benötigen Sie

engine = create_engine(
'mssql+pyodbc://./MyDb', 
strategy='mock', 
executor= lambda sql, *multiparams, **params: print (sql.compile(dialect=engine.dialect))) 

In SQLAlchemy 0.9 die Syntax vereinfacht zu tun ist.

engine = create_engine(
'mssql+pyodbc://./MyDb', 
strategy='mock', 
executor= lambda sql, *multiparams, **params: print (sql) 

Die längere Antwort ist, dass die Erfassung der Ausgabe immer noch einige kleine Probleme hat. Wie bei der Codierung von Literalen von Typen. Aber das war nicht groß genug für jemanden, der sich die Mühe macht, sich zu kratzen. Sie könnten SQLAlchemy immer zulassen, eine leere Datenbank programmgesteuert zu erstellen und die SQL von dort ablegen.

Das schwierigere Problem ist die Behandlung von Schema Migrationen. Dies ist, wo SQLAlchemy-migrate Ihnen helfen kann.

+0

Dieser FAQ-Link ist was ich brauchte, danke! :) Ich war nicht auf der Suche nach Migrationen wie Schema-Management. Ich brauchte einfach einen einfachen Hack, um DDL zu schnappen, ohne mit dem Motor-Echo-Output herumzuspucken. –

+0

Dies scheint sich in Python 0.9 geändert zu haben. Auch scheinen die FAQ für 0.9 nicht zu existieren. –

+0

Die zweite Syntax funktionierte in SQLAlchemy 1.0.12 nicht für mich - siehe https://groups.google.com/d/topic/sqlalchemy/r9neOsc64wc/discussion –