SQLAlchemy 从 create() 打印原始 SQL
我正在尝试使用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()))