【问题标题】:How to generate a file with DDL in the engine's SQL dialect in SQLAlchemy?如何在 SQLAlchemy 中使用引擎的 SQL 方言生成带有 DDL 的文件?
【发布时间】:2010-10-26 15:15:25
【问题描述】:

假设我有一个engine 指向 MySQL 数据库:

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

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

metadata.create_all(engine)

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

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

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

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

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

    【讨论】:

    • 我需要那个FAQ链接,谢谢! :) 我不是在寻找类似迁移的模式管理。简单地说,我需要一个简单的 hack 来获取 DDL,而不会破坏引擎回显输出。
    • 这似乎在 Python 0.9 中发生了变化。此外,0.9 版的常见问题解答似乎不存在。
    • 第二种语法对我来说在 SQLAlchemy 1.0.12 中不起作用 - 请参阅 groups.google.com/d/topic/sqlalchemy/r9neOsc64wc/discussion
    猜你喜欢
    • 2012-01-29
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 2012-04-25
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    相关资源
    最近更新 更多