如何检查SqlAlchemy查询返回的结果是否为空?

3

我想进行如下查询:

    query = users.select().where(users.column.id == id)
    res = await database.execute(query)

我想通过检查 res 来添加一些错误处理。 if not res 似乎不正确。该如何正确处理错误?


是否存在偏见,不检查res.rowcount是否为0?对我来说,这似乎是最合乎逻辑的解决方案,而且它还是内置的。 - c8999c 3f964f64
1
@c8999c3f964f64 这个偏见在于它执行了整个查询来获取行数,而理论上它可以在第一个结果处停止。当我只想知道你是否有任何交通信号灯时,没有必要让你数一下你城市里所有的交通信号灯。 - Ruben Helsloot
我明白了,谢谢你的解释。我只是没有想到问题是要“检查查询是否会返回结果,而不是执行完整个查询”。根据你下面的回答,最坏的情况是它执行了查询的99%,然后返回true,然后你必须再次执行实际的查询,因为它没有完成,可能会缺少结果,对吗? - c8999c 3f964f64
2个回答

2

根据您的查询复杂度不同,将其包装在 SELECT EXISTS(...) 中可能比使用 SELECT ... LIMIT 1 更便宜,正如Antonio所描述的那样。PostgreSQL 可能知道如何同时处理这些查询,但是根据此答案,并非所有 DBMS 都能这样做。

这种解决方案的美妙之处在于,只要找到任何结果,它就存在了 -- 它尽可能地少工作,因此成本最低。在 SQLAlchemy 中,这将是sa.select([sa.exists(query)])


2
您可以尝试从查询中获取第一个对象,并检查它是否为空,例如:

您可以尝试从查询中获取第一个对象,并检查它是否为空

result = users.select().where(users.column.id == id).first()
if not result:
    print('query is empty')

另一种编辑代码的方法是:
res = query.first()

然后检查它是否为空


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