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以什么方式检查该行是否存在? 如果该行存在,我希望查询返回True
或False
。
【参考方案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 可以进行的任何类型的查询。这将返回 False
或 True
而不是 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
查询,返回True
或False
。
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 检查表中是不是存在行的主要内容,如果未能解决你的问题,请参考以下文章