2009-05-15 5 views
7

Предположим, у меня есть engine указывая на базу данных MySQL:Как сгенерировать файл с DDL на SQL-диалекте SQL в SQLAlchemy?

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

я могу заполнить dtdb с таблицами, FKS и т.д. по:

metadata.create_all(engine) 

Есть простой способ для создания файла SQL, который содержит все заявления DDL вместо фактического применения этих операторов DDL к dtdb?

До сих пор я прибегал к захвату вывода журнала SQLAlchemy, созданного echo=True, и редактированию его вручную. Но это слишком больно.

Похоже, что SA имеет довольно сложный API управления схемами, но я не видел примеров просто потоковой передачи определений схемы как текста.

ответ

13

Быстрый ответ в SQLAlchemy 0.8 FAQ.

В SQLAlchemy 0.8 вам нужно сделать

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

В SQLAlchemy 0.9 синтаксис упрощается.

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

Более длинный ответ заключается в том, что улавливание выхода все еще имеет некоторые незначительные проблемы. Как с кодированием литералов типов. Но это не было достаточно большим вопросом для того, чтобы кто-нибудь повышался и царапал свой зуд. Вы всегда можете позволить SQLAlchemy программно создавать пустую базу данных и выгружать SQL оттуда.

Более сложная проблема связана с миграцией схем. Здесь SQLAlchemy-migrate может вам помочь.

+0

Эта ссылка на часто задаваемые вопросы - вот что мне нужно, спасибо! :) Я не искал управления схемами, подобными миграции. Просто мне понадобился простой хак, чтобы захватить DDL, не отбрасывая эхо-сигнал двигателя. –

+0

Это, похоже, изменилось в Python 0.9. Кроме того, часто задаваемые вопросы не существуют для 0,9. –

+0

Второй синтаксис для SQLAlchemy 1.0.12 для меня не работал - см. Https://groups.google.com/d/topic/sqlalchemy/r9neOsc64wc/discussion –