Flask-SQLAlchemy 如何检查表中是否存在某一行数据

79

我有一个Flask应用程序,它使用Flask-SQLAlchemy连接到MySQL数据库。

我想要能够检查表中是否存在某一行。如何修改查询以检查该行是否存在:

db.session.query(User).filter_by(name='John Smith')

我在这个问题上找到了一个解决方案,它使用了SQLAlchemy,但似乎不适用于Flask-SQLAlchemy的工作方式:

from sqlalchemy.sql import exists    
print session.query(exists().where(User.email == '...')).scalar()

谢谢。


第一个查询语句在哪方面没有检查行是否存在? - Daniel Roseman
жҲ‘еёҢжңӣжҹҘиҜўиҝ”еӣһTrueжҲ–FalseпјҢд»ҘиЎЁзӨәиЎҢжҳҜеҗҰеӯҳеңЁгҖӮ - Pav Sidhu
4个回答

109

因为你只想查看用户是否存在,所以不需要查询整个对象。只查询ID,如果标量返回不是None,则表示存在。

exists = db.session.query(User.id).filter_by(name='davidism').first() is not None
SELECT user.id AS user_id 
FROM user 
WHERE user.name = ?

如果你知道name(或者你正在查询的字段)是唯一的,你可以使用scalar代替first

你展示的第二个查询也可以正常工作,Flask-SQLAlchemy没有阻止任何SQLAlchemy可以进行的查询类型。它返回FalseTrue,而不是上面那样的None或一个id,但是它略微更昂贵,因为它使用了一个子查询。

exists = db.session.query(db.exists().where(User.name == 'davidism')).scalar()
SELECT EXISTS (SELECT * 
FROM user 
WHERE user.name = ?) AS anon_1

32
bool(User.query.filter_by(name='John Smith').first())

如果具有此名称的对象不存在,它将返回False,如果存在,则返回True


10
我发现这个答案有用,但我需要修改成 bool(session.query(User).filter_by(name='John Smith').first()) - colorlace
2
它能够工作,但是没有必要获取整个用户信息只为了查找其是否存在。 - Peter Kilczuk

30

.exists()查询嵌套在另一个以session.query()开始,以scalar()结尾的查询中。SQLAlchemy将生成一个优化的EXISTS查询,返回TrueFalse

exists = db.session.query(
    db.session.query(User).filter_by(name='John Smith').exists()
).scalar()
SELECT EXISTS (SELECT 1 
FROM user 
WHERE user.name = ?) AS anon_1

虽然由于子查询而可能更昂贵,但它更清楚地显示了正在查询什么。它可能也比db.exists().where(...)更好,因为它选择常量而不是完整的行。


-8

我认为davidism的回答中有一个错别字,这个对我有效:

exists = db.session.query(**User**).filter_by(name='davidism').scalar() is not None

2
我认为在 User 部分添加星号没有帮助。 - Nuclear03020704
1
请注意,如果您在答案中发现了拼写错误,可以建议进行编辑而不是添加另一个答案。 - bfontaine

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