복붙노트

[PYTHON] Flask-SQLAlchemy 테이블에 행이 있는지 확인

PYTHON

Flask-SQLAlchemy 테이블에 행이 있는지 확인

Flask-SQLAlchemy를 사용하여 MySQL 데이터베이스에 연결하는 Flask 응용 프로그램이 있습니다.

행이 테이블에 있는지 여부를 확인할 수 있기를 원합니다. 행을 확인하려면 다음과 같이 쿼리를 어떻게 수정해야합니까?

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()

감사.

해결법

  1. ==============================

    1.사용자가 존재 하는지를보고 싶기 때문에 전체 개체를 쿼리하고 싶지는 않습니다. ID를 쿼리하면 스칼라 반환이 None이 아닌 경우에만 존재합니다.

    사용자가 존재 하는지를보고 싶기 때문에 전체 개체를 쿼리하고 싶지는 않습니다. ID를 쿼리하면 스칼라 반환이 None이 아닌 경우에만 존재합니다.

    exists = db.session.query(User.id).filter_by(name='davidism').scalar() is not None
    
    SELECT user.id AS user_id 
    FROM user 
    WHERE user.name = ?
    

    두 번째 쿼리는 잘 작동하지만 Flask-SQLAlchemy는 SQLAlchemy에서 수행 할 수있는 모든 쿼리 유형을 막지 않습니다. 위와 같이 None이나 ID 대신 False 또는 True를 반환하지만 하위 쿼리를 사용하기 때문에 약간 더 비쌉니다.

    exists = db.session.query(db.exists().where(User.name == 'davidism')).scalar()
    
    SELECT EXISTS (SELECT * 
    FROM user 
    WHERE user.name = ?) AS anon_1
    
  2. ==============================

    2..exists () 쿼리는 다른 session.query () 끝에 스칼라 () 호출로 래핑하십시오. SQLAlchemy는 True 또는 False를 반환하는 최적화 된 EXISTS 쿼리를 생성합니다.

    .exists () 쿼리는 다른 session.query () 끝에 스칼라 () 호출로 래핑하십시오. SQLAlchemy는 True 또는 False를 반환하는 최적화 된 EXISTS 쿼리를 생성합니다.

    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 ()보다 더 좋을 수도 있습니다. 여기서 (...)는 전체 행 대신 상수를 선택하기 때문입니다.

  3. ==============================

    3.공중 납치를 용서하지만 ... 여기 제공된 지침에 따라 필드의 고유성을 검사하기 위해 다음과 같은 WTForm 검사기를 만들었습니다.

    공중 납치를 용서하지만 ... 여기 제공된 지침에 따라 필드의 고유성을 검사하기 위해 다음과 같은 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 세션을 필요로하지 않는 API를 갖고 싶습니다.

    class Register(Form):
        email = EmailField('Email', [Unique(User.email)])
    

    모델로부터 db 세션을 얻을 수있는 방법이 있습니까? 세션이 없으면 객체 전체를로드하지 않고 그 존재를 확인하는 것이 불가능한 것처럼 보입니다.

  4. ==============================

    4.데이비드의 대답에 오타가 있다고 생각하면 저에게 좋습니다 :

    데이비드의 대답에 오타가 있다고 생각하면 저에게 좋습니다 :

    exists = db.session.query(**User**).filter_by(name='davidism').scalar() is not None
    
  5. from https://stackoverflow.com/questions/32938475/flask-sqlalchemy-check-if-row-exists-in-table by cc-by-sa and MIT license