PANDAS/SQLALCHEMY/PYODBC:结果对象在SELECT之前出现更新语句时不会从存储的Proc返回行



我正在使用SQL Server 2014,PANDAS 0.23.4,SQLALCHEMY 1.2.11,PYODBC 4.0.24和PYTHON 3.7.0。我有一个非常简单的存储过程,可以在表上执行更新,然后在其中进行选择:

CREATE PROCEDURE my_proc_1
    @v2     INT
AS
BEGIN
    UPDATE my_table_1 
    SET v2 = @v2 
    ;
    SELECT * from my_table_1
    ;
END 
GO

这在MS SQL Server Management Studio中运行良好。但是,当我尝试使用此代码通过Python调用它时:

import pandas as pd
from sqlalchemy import create_engine
if __name__ == "__main__":
    conn_str = 'mssql+pyodbc://@MODEL_TESTING'
    engine = create_engine(conn_str)
    with engine.connect() as conn:
        df = pd.read_sql_query("EXEC my_proc_1 33", conn)
        print(df)

我有以下错误:

sqlalchemy.exc.resourceclosederror:此结果对象不返回 行。它已自动关闭。

(请告诉我,如果您想要完整的堆栈跟踪,我将更新)

当我从存储的proc中删除更新时,代码运行并返回结果。还要注意,从表面上除了更新的表之外的其他表中选择没有什么区别,我会遇到相同的错误。任何帮助都非常感谢。

问题是,更新语句正在返回一个行计数,这是标量值,而选择语句返回的行被"卡在"行计数后面的"卡在",其中PyodBC无法"请参阅"他们(没有其他阴谋)。

确保我们的存储过程始终以SET NOCOUNT ON;语句开头,以抑制从DML语句(Update,Delete等)的返回行的返回,并允许存储过程只返回行,这是一种最佳实践。从选择语句。

对我来说,我出于另一个原因而遇到了同样的问题,我使用的是sqlachmey最新语法select来获取表格的条目,我忘了写表级的名称i想要从中获取值,所以我得到了此错误,所以我只添加了表的名称作为解决错误的参数。

代码导致错误

query = select().where(Assessment.created_by == assessment.created_by)

只需通过添加表格名称来解决它,有时问题仅在语法HHH

query = select(Assessment).where(Assessment.created_by == assessment.created_by)

相关内容

  • 没有找到相关文章

最新更新