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

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

我对这里的行为感到非常困惑。当将下面的代码与原始 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]函数序列错误 (0) (SQLFetch)')

我已经尝试过

.fetchall()
,查看了sqlalchemy文档,搜索了网络和可信的ChatGPT,但我空手而归。

使用相同的函数和 UPDATE 语句是可行的!

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

将所有结果提取到内存中并从函数中返回它们。您可以使用 .fetchall()

来完成此操作
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)
        # Fetch all rows and return them
        rows = result.fetchall()
        return rows

user = db(find_user)
for row in user:
    print(row)

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.