Python PYODBC:前一个 SQL 不是查询

Python PYODBC: Previous SQL was not a query

我经历过:

但是 none 他们已经解决了这个问题。

我的 db.py 文件中的片段如下:

result = cursor.execute(self.sql,self.params)
if result is None:
    self.data = []
else:
    self.data = [dict(zip([key[0] for key in cursor.description], row)) for row in result.fetchall()]
cnxn.close()
return self.data

这适用于我使用过的每个 SQL 和存储过程,除了这个

seq = request.form['seq']
s = 'EXEC sp_add ?, ?'
p = (udf.get_username(), int(seq))
l = Conn.testing(db="testingDatabase",sql=s,params=p)

我收到错误:

Previous SQL was not a query

SQL:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE sp_add
    @user nvarchar(50),
    @seq int
AS
BEGIN
    SET NOCOUNT ON;

    insert into tblName (userCol,seqCol) VALUES (@user,@seq)
END
GO

存储过程运行并插入行,但出现错误。

我做的是:

result = cursor.execute(self.sql,self.params)
cnxn.close()
return str(result)

这个returns:

EXEC sp_add ?, ?

为什么会这样 return?为什么它 return 我刚刚传递给它的语句?

在我的 SP 中,如果我标记 SELECT 语句,那么问题就会消失。

除了刚才提到的 hack 之外还有什么建议吗?

根据 Python 数据库 API PEP 249 规范,未定义 cursor.execute 的 return 值。所以DB-APIs像pyodbc不需要定义一致的return值。

但是,特别是对于 pyodbc,cursor.execute() return 是一个 <pyodbc.Cursor> 对象,如果对象包含一个值但将是 None,则该对象保持 description 属性如果一个动作命令:

result = cursor.execute(self.sql, self.params)

if result.descripton is None:
    self.data = []
else:
    self.data = [
        dict(zip([key[0] for key in cursor.description], row)) 
        for row in 
        result.fetchall() 
    ]
cnxn.close()

return self.data   # METHODS INSIDE CLASSES DO NOT REQUIRE RETURN

甚至考虑一个三元运算符:

result = cursor.execute(self.sql, self.params)

self.data = (
    [
        dict(zip([key[0] for key in result.description], row)) 
        for row in result.fetchall()
    ]
    if result.descripton is not None
    else []
)

cnxn.close()

return self.data