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

Posted

技术标签:

【中文标题】Flask-SQLAlchemy 检查表中是不是存在行【英文标题】: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 【参考方案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 部分添加星号没有帮助。

以上是关于Flask-SQLAlchemy 检查表中是不是存在行的主要内容,如果未能解决你的问题,请参考以下文章

Flask-Sqlalchemy:数据库查询不返回新数据

sqlalchemy和flask-sqlalchemy

Flask 学习-13.Flask-SQLAlchemy 新建模型和字段

如何检查Mysql表中是不是存在记录[重复]

检查表中是不是存在特定元组

检查实体是不是在外部表中被引用并获取实体