我对这里的行为感到非常困惑。当将下面的代码与原始 SQL 命令单独使用时,我没有问题,但一旦我将它放入函数中并调用它,我就会收到异常错误。
在函数之外 - 绝对没问题!
engine = create_engine("mssql+pyodbc://{}:{}@{}/{}?driver={}".format(
username, password, server, database, driver))
with engine.connect() as conn:
result = conn.execute(text(find_user))
try:
for row in result:
print(row)
功能内
find_user = f"SELECT * FROM UserTable where UserId = 001"
def db(sql_command):
engine = create_engine("mssql+pyodbc://{}:{}@{}/{}?driver={}".format(
username, password, server, database, driver), echo=True)
with engine.begin() as conn:
result = conn.execute(text(sql_command))
print(result.rowcount)
return result
user = db(find_user)
for row in user:
print(row)
这是我收到的错误:
(pyodbc.Error) ('HY010', '[HY010] [Microsoft][SQL Server Native Client 11.0]Function sequence error (0) (SQLFetch)')
我已经尝试过
.fetchall()
,查看了sqlalchemy文档,搜索了网络和可信的ChatGPT,但我空手而归。
使用相同的函数和 UPDATE 语句是可行的!
我很确定一旦你离开
with
块,连接就会被清理干净。您不会立即获得结果,因此当您尝试迭代最后几行中的 user
时,获取会失败。上面的示例迭代 with
块中的结果,这样就可以解决问题。
我认为你需要像这样在
fetchall()
中添加db
:
return result.fetchall()
OR 迭代结果,即。
for row in result
在 with
块内。
另外,我认为
rowcount
仅适用于 UPDATE
和 DELETE
,我不确定 fetchall()
对这些有什么作用,所以也许这两种行为是不兼容的。