簡體   English   中英

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

[英]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 可以進行的任何類型的查詢。 這將返回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

.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(...)更可取,因為它選擇一個常量而不是整行。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM