如何在SQLAlchemy中以引擎的SQL方言生成DDL文件?
假设我有一个指向 MySQL 数据库的 engine
:
engine = create_engine('mysql://arthurdent:answer42@localhost/dtdb', echo=True)
我可以通过以下方式在 dtdb
中填充表、外键等:
metadata.create_all(engine)
有没有简单的方法可以生成一个 SQL 文件,这个文件里包含所有的 DDL 语句,而不是直接把这些 DDL 语句应用到 dtdb
上呢?
到目前为止,我只能通过设置 echo=True
来捕捉 SQLAlchemy 的日志输出,然后手动编辑这些内容。但这样做实在是太麻烦了。
看起来 SQLAlchemy 有相当复杂的架构管理 API,但我还没看到简单地将架构定义以文本形式输出的例子。
1 个回答
15
简单来说,你可以在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-migrate来帮你。