sqlalchemy - 在函数中使用带有 SELECT 语句的原始 sql 会出现错误

问题描述 投票:0回答:1

我对这里的行为感到非常困惑。当将下面的代码与原始 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 语句是可行的!

python sql sql-server sqlalchemy pyodbc
1个回答
0
投票

我很确定一旦你离开

with
块,连接就会被清理干净。您不会立即获得结果,因此当您尝试迭代最后几行中的
user
时,获取会失败。上面的示例迭代
with
块中的结果,这样就可以解决问题。

我认为你需要像这样在

fetchall()
中添加
db

    return result.fetchall()

OR 迭代结果,即。

for row in result
with
块内。

另外,我认为

rowcount
仅适用于
UPDATE
DELETE
,我不确定
fetchall()
对这些有什么作用,所以也许这两种行为是不兼容的。

© www.soinside.com 2019 - 2024. All rights reserved.