[英]Flask-SQLAlchemy check if row exists in table
我有一個 Flask 應用程序,它使用 Flask-SQLAlchemy 連接到 MySQL 數據庫。
我希望能夠檢查表中是否存在一行。 我將如何修改這樣的查詢以檢查該行是否存在:
db.session.query(User).filter_by(name='John Smith')
我在這個問題上找到了一個使用 SQLAlchemy 的解決方案,但似乎不符合 Flask-SQLAlchemy 的工作方式:
from sqlalchemy.sql import exists
print session.query(exists().where(User.email == '...')).scalar()
謝謝。
由於您只想查看用戶是否存在,因此您不想查詢整個對象。 只查詢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
將.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(...)
更可取,因為它選擇一個常量而不是整行。
bool(User.query.filter_by(name='John Smith').first())
如果具有此名稱的對象不存在,它將返回False
如果存在則返回True
。
原諒劫持,但......按照這里給出的指示,我制作了以下WTForm驗證器,以檢查該字段的唯一性
class Unique(object):
def __init__(self, column, session, message="Already exists."):
self.column = column
self.session = session
self.message = message
def __call__(self, form, field):
if field.data == field.object_data:
return # Field value equals to existing value. That's ok.
model = self.column.class_
query = model.query.filter(self.column == field.data).exists()
if self.session.query(query).scalar():
raise ValidationError(self.message)
它會像這樣使用
class Register(Form):
email = EmailField('Email', [Unique(User.email, db.session)])
但是,我想擁有不需要db session作為第二個參數的API
class Register(Form):
email = EmailField('Email', [Unique(User.email)])
有沒有辦法從模型中獲取數據庫會話? 沒有會話,似乎不可能避免加載整個對象來檢查它的存在。
認為 davidism 的答案有錯別字,這對我有用:
exists = db.session.query(**User**).filter_by(name='davidism').scalar() is not None
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.