Flask-SQLAlchemy检查表中是否存在行

Pav*_*dhu 26 python sqlalchemy flask flask-sqlalchemy

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

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

db.session.query(User).filter_by(name='John Smith')
Run Code Online (Sandbox Code Playgroud)

我找到了一个使用SQLAlchemy的问题的解决方案,但似乎不符合Flask-SQLAlchemy的工作方式:

from sqlalchemy.sql import exists    
print session.query(exists().where(User.email == '...')).scalar()
Run Code Online (Sandbox Code Playgroud)

谢谢.

dav*_*ism 39

由于您只想查看用户是否存在,因此您不希望查询整个对象.只查询id,如果标量返回不是None,则存在.

exists = db.session.query(User.id).filter_by(name='davidism').scalar() is not None
Run Code Online (Sandbox Code Playgroud)
SELECT user.id AS user_id 
FROM user 
WHERE user.name = ?
Run Code Online (Sandbox Code Playgroud)

您展示的第二个查询也可以正常工作,Flask-SQLAlchemy不会阻止SQLAlchemy可以进行任何类型的查询.这将返回FalseTrue代替None或上面的id,但它稍微昂贵,因为它使用子查询.

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


Ann*_*nna 20

bool(User.query.filter_by(name='John Smith').first())
Run Code Online (Sandbox Code Playgroud)

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

  • 我发现这个答案很有用,但我不得不将其更改为 `bool(session.query(User).filter_by(name='John Smith').first())` (6认同)
  • 它正在工作,但不需要获取整个用户来查找它是否存在。 (2认同)

lys*_*ing 12

最后通过调用将.exists()查询包装到另一个查询中.SQLAlchemy将生成一个返回或的优化查询.session.query()scalar()EXISTSTrueFalse

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

虽然由于子查询可能会更昂贵,但更清楚的是被查询的内容.它也可能是优选的,db.exists().where(...)因为它选择常量而不是整行.