SQLAlchemy打印结果而不是对象

17
我试图通过下面的代码将查询结果打印到控制台,但它一直返回对象位置。
test = connection.execute('SELECT EXISTS(SELECT 1 FROM "my_table" WHERE Code = 08001)')
print(test)

我得到的结果是- <sqlalchemy.engine.result.ResultProxy object at 0x000002108508B278>

如何打印出value而不是对象?

我提出这个问题的原因是因为我想使用该值进行比较测试。例如:

if each_item not in test:
    # do stuffs
3个回答

18

就像这样,test 包含您的查询返回的所有行。

如果您想要迭代的内容,您可以使用 fetchall。例如:

test = connection.execute('SELECT EXISTS(SELECT 1 FROM "my_table" WHERE Code = 08001)').fetchall()

然后您可以迭代一组行,在每行中包含所有字段。在您的示例中,您可以通过它们的位置访问字段。在位置一上只有一个字段。所以这是您可以访问 1 的方式:

for row in test:
    print(row[0])

这个返回值是 0,不确定为什么。 - jake wong
好的,我想我知道原因了。它被存储在 SQL 中作为一个“字符串”,所以这就是为什么它返回了“0”的原因 :) - jake wong
如果它是一个数字,就不应该有前导零,这是有道理的。当我重现了这个问题时,我使用了一个“数字”,而不是一个“字符串”。 - sandor
如果没有返回的行,比如在BEGIN/END子句中怎么办? sqlalchemy.exc.ResourceClosedError: 此结果对象不返回行。 它已被自动关闭。 - alex

1

test是一个包含行值的对象。因此,如果列名为value,您可以使用test.value进行调用。

如果您正在寻找更加“方便”的方法来执行此操作(例如遍历test的每个列),则必须明确定义这些函数(作为test的方法或设计用于遍历这些类型的行的其他函数)。


-1
这是上面提到的一种原始SQL的方法(是的,如果使用原始SQL,请注意SQL注入)。我仍然希望他们能够提供一种更好的内置方法来实现这一点。我知道这会给SQLAlchemy引擎的结果对象增加额外的开销,但这样做肯定会更清晰。我正在尝试使用SQLAlchemy,这样我就可以在不改变代码的情况下切换不同的后端(SQLite/PostgreSQL/MySQL)。
from sqlalchemy import select, create_engine, text

engine = create_engine(f"sqlite:///foo.sqlite3")

with engine.connect() as con:
    rs = con.execute(text(sql))

sql "SELECT * FROM mytable"
rs = con.execute(text(sql))

rows = []
for row in rs:
    rows.append(row._mapping)
    print(rows[0])
print(rows[0]['mycolumnname'])
print(rows[1]['mycolumnname'])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接