【问题标题】:SQLalchemy:query returns a non-resultSQLalchemy:查询返回非结果
【发布时间】:2020-07-07 15:50:52
【问题描述】:

我在获取由 sqlalchemy 调用的存储过程返回的结果时遇到问题,我看到即使存储过程返回一个整数 sql alcehmy。结果集设置为无,这导致了一些问题,有人可以告诉我发生了什么吗?

CREATE PROCEDURE [SYSDATA].[getCertificateInstallStatus] 
@DVSystemName [varchar](max)
AS
BEGIN
declare @system_state int = (SELECT state FROM SYSDATA.certificate where DVSystemName = @DVSystemName)
if @system_state is not NULL
    Return @system_state
Return 0
END

现在执行这个存储过程:

DECLARE @return_value int

EXEC    @return_value = [SYSDATA].[getCertificateInstallStatus]
        @DVSystemName = N'UATDSG'

SELECT  'Return Value' = @return_value

GO

调用此过程返回:

Return Value
0

Python 错误跟踪:

Traceback(最近一次调用最后一次):文件 “/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/SQLAlchemy-1.2.7-py3.6-macosx-10.9-x86_64.egg/sqlalchemy/engine/result.py” , 第 1067 行,在 _fetchone_impl 中 return self.cursor.fetchone() AttributeError: 'NoneType' object has no attribute 'fetchone'

在处理上述异常的过程中,又发生了一个异常: ...... 文件 “/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/SQLAlchemy-1.2.7-py3.6-macosx-10.9-x86_64.egg/sqlalchemy/engine/result.py” , 第 1089 行,在 _non_result 中 “这个结果对象不返回行。” sqlalchemy.exc.ResourceClosedError:这个结果对象不返回 行。它已自动关闭。

【问题讨论】:

    标签: python sql-server sqlalchemy


    【解决方案1】:

    对意外结果的解释是存储过程中的语句没有返回结果集,它返回一个整数值。这导致了另一个问题——当存储过程返回一个非零值(使用RETURN 语句)时,这表示失败。

    您需要更改存储过程,并且您至少有两个选择:1)返回结果集或 2)使用输出参数。

    存储过程返回结果集:

    CREATE PROCEDURE [SYSDATA].[getCertificateInstallStatus] 
        @DVSystemName [varchar](max)
    AS
    BEGIN
        SET NOCOUNT ON
    
        SELECT COALESCE([state], 0) AS [SystemState]
        FROM SYSDATA.certificate 
        WHERE DVSystemName = @DVSystemName)
    
        RETURN 0
    END
    

    带有输出参数的存储过程:

    CREATE PROCEDURE [SYSDATA].[getCertificateInstallStatus] 
        @DVSystemName [varchar](max),
        @SystemState int OUTPUT
    AS
    BEGIN
        SET NOCOUNT ON
    
        SELECT @SystemState = COALESCE([state], 0) 
        FROM SYSDATA.certificate 
        WHERE DVSystemName = @DVSystemName
    
        RETURN 0
    END
    

    【讨论】:

      猜你喜欢
      • 2014-03-13
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 2020-11-13
      • 2017-08-23
      • 1970-01-01
      相关资源
      最近更新 更多