Как сгенерировать файл с DDL на диалекте SQL движка в SQLAlchemy?
-
22-08-2019 - |
Вопрос
Предположим, у меня есть engine
указывая на базу данных MySQL:
engine = create_engine('mysql://arthurdent:answer42@localhost/dtdb', echo=True)
я могу заселить dtdb
с таблицами, ФК и т. д.:
metadata.create_all(engine)
Есть ли простой способ создать файл SQL, содержащий все операторы DDL, вместо того, чтобы фактически применять эти операторы DDL к dtdb
?
До сих пор я прибегал к захвату вывода журнала SQLAlchemy, созданного echo=True
, и редактируем его вручную.Но это слишком больно.
Похоже, что у SA довольно сложный API управления схемами, но я не видел примеров простой потоковой передачи определений схемы в виде текста.
Решение
Быстрый ответ находится в Часто задаваемые вопросы по SQLAlchemy 0.8.
В 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-мигрировать могу помочь тебе.