10

假设我engine指向 MySQL 数据库:

engine = create_engine('mysql://arthurdent:answer42@localhost/dtdb', echo=True)

我可以通过以下方式填充dtdb表格、FK 等:

metadata.create_all(engine)

有没有一种简单的方法来生成包含所有 DDL 语句的 SQL 文件,而不是将这些 DDL 语句实际应用于dtdb

到目前为止,我已经求助于捕获由 生成的 SQLAlchemy 日志输出echo=True,并手动对其进行编辑。但这太痛苦了。

看起来 SA 有非常精细的模式管理 API,但我还没有看到简单地将模式定义流式传输为文本的示例。

4

1 回答 1

15

快速答案在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可以帮助你的地方。

于 2009-05-15T21:33:37.847 回答