如何使用SQLAlchemy为MSSQL创建临时表?

时间:2018-08-15 17:36:01

标签: sql-server sqlalchemy

我尝试了以下使用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,并且返回的ID相同(这意味着从MSSQL的角度来看,我也处于同一会话中)

后来的测试:我启用了完整的SQLAlchemy调试,并且注意到table.create()导致在create table语句之后发出“提交”。不知何故,此提交导致临时表变得不可访问。我进行了实验,发现如果未发出此提交,则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(不会发出提交)执行该操作

1 个答案:

答案 0 :(得分:2)

几点:
->检查是否正确创建了引擎。检查链接并查找Microsoft SQL Server标题。链接:http://docs.sqlalchemy.org/en/latest/core/engines.html
->检查您的元数据是否已绑定到引擎。