Python 烧瓶SQLAlchemy检查表中是否存在行

Python 烧瓶SQLAlchemy检查表中是否存在行,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,我有一个Flask应用程序,它使用Flask SQLAlchemy连接到MySQL数据库 我希望能够检查表中是否存在行。如何修改这样的查询以检查行是否存在: db.session.query(User).filter_by(name='John Smith') 我找到了一个使用SQLAlchemy的解决方案,但似乎与SQLAlchemy的工作方式不符: from sqlalchemy.sql import exists print session.query(exists().wher

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

我希望能够检查表中是否存在行。如何修改这样的查询以检查行是否存在:

db.session.query(User).filter_by(name='John Smith')
我找到了一个使用SQLAlchemy的解决方案,但似乎与SQLAlchemy的工作方式不符:

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

谢谢。

因为您只想查看用户是否存在,所以不想查询整个对象。仅查询id,如果标量返回值不是None,则该id存在

exists = db.session.query(User.id).filter_by(name='davidism').first() is not None
选择user.id作为用户\u id 来自用户 其中user.name=? 如果您知道名称或您要查询的任何字段是唯一的,则可以使用标量而不是第一个字段

您显示的第二个查询也可以正常工作,Flask SQLAlchemy不会阻止SQLAlchemy可以进行的任何类型的查询。这将返回False或True,而不是None或类似于上面的id,但由于使用子查询,因此成本稍高一些

exists = db.session.query(db.exists().where(User.name == 'davidism')).scalar()
选择存在选择* 来自用户 其中user.name=?作为anon_1 在另一个session.query中包装.exists查询,并在末尾使用标量调用。SQLAlchemy将生成一个优化的EXISTS查询,返回True或False

选择存在选择1 来自用户 其中user.name=?作为anon_1
虽然由于子查询的缘故,它可能会更加昂贵,但它对所查询的内容更加清楚。它也可能优于db.exists。其中。。。因为它选择的是一个常量而不是整行。

我认为davidism的答案中有一个输入错误,这对我很有用:

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

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

第一个查询以什么方式不检查行是否存在?如果行存在,我希望查询返回True或False。只需使用count,query.count我发现这个答案很有用,但我不得不将其更改为boolsession.queryUser.filter_byname='John Smith'。首先它正在工作,但是没有必要仅仅为了找到它是否存在而获取整个用户。我认为在用户部分添加星号没有帮助。
exists = db.session.query(**User**).filter_by(name='davidism').scalar() is not None
bool(User.query.filter_by(name='John Smith').first())