Как сгенерировать файл с DDL на диалекте SQL движка в SQLAlchemy?

StackOverflow https://stackoverflow.com/questions/870925

  •  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-мигрировать могу помочь тебе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top