Python PYODBC:前一个 SQL 不是查询
Python PYODBC: Previous SQL was not a query
我经历过:
- Error "Previous SQL was not a query" in Python?
- MSSQL2008 - Pyodbc - Previous SQL was not a query
- How to check if a result set is empty?
但是 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
我经历过:
- Error "Previous SQL was not a query" in Python?
- MSSQL2008 - Pyodbc - Previous SQL was not a query
- How to check if a result set is empty?
但是 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