【发布时间】:2018-08-15 17:36:01
【问题描述】:
我尝试了以下使用 SQLA 为 MSSQL 创建临时表的方法:
table_name = "#foo"
meta = MetaData(bind = session.bind)
table = Table(quoted_name(table_name, quote=False),
meta,
Column('a_number', Integer),
Column('device_Id', Integer),
Column('cost', Integer)
)
table.create()
执行此操作时没有错误,但如果我跟进尝试访问表的 SQL 语句,则会出现错误。 (错误表明#foo 不存在)
另外,如果我查看我的 MSSQL 会话中的临时表,没有提到该表,进一步证明它不存在。
请注意,我认为这不是连接问题 - 如果我注释掉上面的 table.create() 并“手动”创建表,如 session.execute("create #foo..")成功,随后的插入和读取也是如此。所以我想我一直都在同一个连接上。此外,我可以在调试器中单步执行此操作并间歇性地请求我的 MSSQL 会话 ID,它会返回相同的结果(这意味着从 MSSQL 的角度来看,我也在同一个会话中)
稍后的测试:我启用了完整的 SQLAlchemy 调试,我注意到它 table.create() 导致在 create table 语句之后发出“提交”。不知何故,这个提交导致临时表变得不可访问。我做了实验,发现如果没有发出这个commit,那么table.create()就可以工作,并且可以在后续语句中访问临时表。
这是我的“解决方法”,直到我弄清楚为什么发出提交和/或为什么提交导致临时表“消失”:
table_name = "#foo"
meta = MetaData(bind = session.bind)
table = Table(quoted_name(table_name, quote=False),
meta,
Column('a_number', Integer),
Column('device_Id', Integer),
Column('cost', Integer)
)
session.execute(CreateTable(table))
在上述方法中,CreateTable 返回实际的 SQL 创建语法,然后通过 session.execute 执行(不会发出提交)
【问题讨论】:
标签: sql-server sqlalchemy