SQLAlchemy 从 create() 打印原始 SQL

67 投票
5 回答
40784 浏览
提问于 2025-04-15 18:24

我正在尝试使用Pylons和SQLAlchemy,感觉非常不错。不过我有一个问题,就是在执行之前,能不能把通过Table().create()生成的原始SQL CREATE TABLE 数据打印出来呢?

5 个回答

15

我需要获取原始的表格SQL,以便为一些现有的模型设置测试。这是我为SQLAlchemy 0.7.4创建的一个成功的单元测试,参考了Antoine的回答,作为概念验证的例子:

from sqlalchemy import create_engine
from sqlalchemy.schema import CreateTable
from model import Foo

sql_url = "sqlite:///:memory:"    
db_engine = create_engine(sql_url)

table_sql = CreateTable(Foo.table).compile(db_engine)
self.assertTrue("CREATE TABLE foos" in str(table_sql))
21

你可以通过以下方式设置你的引擎,以便输出元数据创建的顺序:

def metadata_dump(sql, *multiparams, **params):
    # print or write to log or file etc
    print(sql.compile(dialect=engine.dialect))

engine = create_engine(myDatabaseURL, strategy='mock', executor=metadata_dump)
metadata.create_all(engine)

这种方法的一个好处是,输出中会包含枚举和索引。而使用 CreateTable 的话,这些就不会被包含在内。

另一个好处是,模式定义的顺序是正确的,几乎可以直接用作脚本。

130
from sqlalchemy.schema import CreateTable
    
print(CreateTable(table))

如果你在使用声明式语法:

print(CreateTable(Model.__table__))

更新:

因为我已经得到了认可的答案,并且在 klenwell 的回答 中有重要信息,所以我也会把它加在这里。

你可以通过与你的数据库引擎一起编译,获取适合你特定数据库(比如 MySQL、Postgresql 等)的 SQL 语句。

print(CreateTable(Model.__table__).compile(engine))

更新 2:

@jackotonye 在评论中添加了一种不使用引擎的方法。

from sqlalchemy.schema import CreateTable
from sqlalchemy.dialects import postgresql

print(CreateTable(Model.__table__).compile(dialect=postgresql.dialect()))

撰写回答