我正在使用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)