代码之家  ›  专栏  ›  技术社区  ›  Pavel Repin

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

  •  8
  • Pavel Repin  · 技术社区  · 16 年前

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

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

    我可以填充 dtdb 表格、FK等:

    metadata.create_all(engine)
    

    是否有一种简单的方法来生成包含所有DDL语句的SQL文件,而不是将这些DDL语句实际应用于 动态数据库 ?

    到目前为止,我已经尝试捕获由 echo=True 以及手工编辑。但那太痛苦了。

    看起来SA有非常复杂的模式管理API,但是我没有看到简单地将模式定义作为文本进行流式处理的例子。

    1 回复  |  直到 7 年前
        1
  •  14
  •   Andrew E    7 年前

    快速的答案在 SQLAlchemy 0.8 FAQ .

    在sqlacalchemy 0.8中,您需要执行

    engine = create_engine(
    'mssql+pyodbc://./MyDb',
    strategy='mock',
    executor= lambda sql, *multiparams, **params: print (sql.compile(dialect=engine.dialect)))
    

    在sqlacalchemy 0.9中,语法被简化。

    engine = create_engine(
    'mssql+pyodbc://./MyDb',
    strategy='mock',
    executor= lambda sql, *multiparams, **params: print (sql)
    

    更长的答案是捕获输出仍然存在一些小问题。就像对类型的文本进行编码一样。但这并不是一个大问题,任何人都不能站起来挠痒痒。您可以始终让SQLAlchemy以编程方式创建一个空数据库,并从中转储SQL。

    更困难的问题是模式迁移的处理。这里就是 SQLAlchemy-migrate 可以帮助你。