【问题标题】:How to use SQLAlchemy to create a temp table for MSSQL?如何使用 SQLAlchemy 为 MSSQL 创建临时表?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 我们正在使用一个连接字符串,它确实包含“mssql+pyodb”“mssql+pyodbc:///?odbc_connect=DRIVER={FreeTDS};TDS_Version=8.0;SERVER”的明显重要部分=XXX;PORT=1433;UID=XXX;PWD=XX;DATABASE=XXX" 我的 metadata.bind 引用了一个似乎有效的 Engine 对象..即它的 url 字段包含上面的连接字符串...
    • 请不要在 cmets 中飞溅代码。它们没用,因为格式不够健壮。
    • 更新问题?
    猜你喜欢
    • 2013-12-03
    • 2012-03-24
    • 2020-11-27
    • 2016-12-03
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 2021-05-18
    • 2023-02-02
    相关资源
    最近更新 更多