【问题标题】:Flask-SQLAlchemy check if row exists in tableFlask-SQLAlchemy 检查表中是否存在行
【发布时间】:2016-01-01 12:17:10
【问题描述】:

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

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

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

我在this question 上找到了一个使用 SQLAlchemy 但似乎不适合 Flask-SQLAlchemy 工作方式的解决方案:

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

谢谢。

【问题讨论】:

  • 第一个查询not以什么方式检查该行是否存在?
  • 如果该行存在,我希望查询返回TrueFalse

标签: python flask sqlalchemy flask-sqlalchemy


【解决方案1】:

由于您只想查看用户是否存在,因此您不想查询整个对象。只查询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

【讨论】:

    【解决方案2】:
    bool(User.query.filter_by(name='John Smith').first())
    

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

    【讨论】:

    • 我发现这个答案很有用,但我不得不将其更改为 bool(session.query(User).filter_by(name='John Smith').first())
    • 它正在工作,但不需要获取整个用户只是为了查找它是否存在。
    【解决方案3】:

    .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(...) 更可取,因为它选择一个常量而不是整行。

    【讨论】:

      【解决方案4】:

      认为大卫主义的回答中有错字,这对我有用:

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

      【讨论】:

      • 我认为在 User 部分添加星号没有帮助。
      猜你喜欢
      • 2019-04-12
      • 2017-03-31
      • 2022-01-24
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 2018-10-21
      • 2015-11-16
      相关资源
      最近更新 更多