如何在SQLAlchemy中以引擎的SQL方言生成DDL文件?

11 投票
1 回答
7911 浏览
提问于 2025-04-15 11:37

假设我有一个指向 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来帮你。

撰写回答