SQLAlchemy中ResultProxy的returns_rows属性失效问题
问题分析与解决方案
嘿,我之前也踩过这个坑!你完全误解了returns_rows属性的作用——它根本不是用来判断查询有没有实际返回数据的,而是用来识别你执行的SQL语句本身是否属于会产生行结果的类型。
举个直白的例子:
- 只要你执行的是
SELECT、SELECT ... FOR UPDATE这类天生要返回行的查询,不管最终有没有匹配到数据,returns_rows都会返回True; - 但如果你执行
INSERT、UPDATE、DELETE或者COMMIT这类不返回行的操作,returns_rows才会返回False。
所以哪怕你查的ISBN在数据库里完全不存在,returns_rows还是会是True,因为你跑的是SELECT语句呀,这和有没有找到数据毫无关系。
正确的处理方式
直接调用fetchone(),然后判断返回值是否为None就够了,这是最直接可靠的方法:
# 执行查询并尝试获取第一行结果 result = db.execute("SELECT * FROM books WHERE isbn=:isbn", {"isbn": id}) book = result.fetchone() # 如果没有匹配到数据,fetchone()会返回None if book is None: return "Not found." # 后续处理找到的book数据 # ...
嫌麻烦的话也可以写成更简洁的版本:
book = db.execute("SELECT * FROM books WHERE isbn=:isbn", {"isbn": id}).fetchone() if not book: return "Not found." # ...
额外小补充
如果你确实想提前知道有多少行匹配,也可以试试rowcount属性,但要注意:部分数据库(比如PostgreSQL)在处理SELECT语句时,rowcount可能不会实时返回准确行数(除非你先把所有结果都取出来)。不过对于你这种基于唯一标识(ISBN应该是唯一的)的查询,rowcount还是能正确返回0或1的,但相比之下,直接用fetchone()判断None是更高效、更稳妥的选择。
内容的提问来源于stack exchange,提问作者Wesley Gonçalves
相关产品推荐
相关产品推荐

