declarative_base ()와 db.Model의 차이점은 무엇입니까?


86

빠른 시작 자습서 플라스크-SQLAlchemy의 플러그인에 지시 사용자가 상속 테이블 모델을 생성하는 db.Model클래스를, 예를 들어,

app = Flask(__main__)
db = SQLAlchemy(app)
class Users(db.Model):
    __tablename__ = 'users'
    ...

그러나 SQLAlchemy 자습서 와 bottle-SQLAlchemy README는 모두 테이블 모델 Basedeclarative_base().

Base = declarative_base()
class Users(Base):
    __tablename__ = 'users'
    ...

이 두 가지 접근 방식의 차이점은 무엇입니까?

답변:


84

Flask-SQLAlchemy 소스 코드를 보면 db.Model클래스가 다음과 같이 초기화됩니다.

self.Model = self.make_declarative_base()

그리고 make_declarative_base()방법 은 다음과 같습니다 .

def make_declarative_base(self):
    """Creates the declarative base."""
    base = declarative_base(cls=Model, name='Model',
                            metaclass=_BoundDeclarativeMeta)
    base.query = _QueryProperty(self)
    return base

_BoundDeclarativeMeta메타 클래스는 SQLAlchemy의의의 서브 클래스 DeclarativeMeta, 단순히에 대한 기본 값 계산에 대한 지원을 추가 __tablename__(테이블 이름) 또한 핸들의 바인딩에.

base.query속성을 사용하면 Flask-SQLAlchemy 기반 모델 Model.query이 SQLAlchemy의 session.query(Model).

_QueryProperty쿼리 클래스도 SQLAlchemy의의 쿼리에서 서브 클래스된다. Flask-SQLAlchemy 하위 클래스는 SQLAlchemy에없는 세 가지 추가 쿼리 메서드 인 get_or_404(), first_or_404()paginate().

나는 이것이 유일한 차이점이라고 믿습니다.


1
나는 오늘 내가 1 년 정도 만든이 앱을 위해 이것을 찾고 있었는데, 원래는 Base = Declarative_Base를 명시 적으로 사용하는 대신 db.Model을 사용하는 "Mega Flask Tutorial"을 기반으로했습니다. 내 모델은 모두 Declarative 확장을 명확하게 사용하기 때문에 혼란 스러웠지만 declarative_base ()를 호출 한 적이 없습니다. 훌륭한 설명에 감사드립니다!
Chockomonkey 2016-01-11

하나의 사용자 모델에서 db.Model을 사용하고 주소 모델에서 Base를 사용할 수 있습니까? 예 :-class User (db.Model), class Address (Base)?
Saif ali Karedia

확실하지 않지만 내 생각에는 어떤 것들이 작동하지 않을 것입니다. Flask-SQLAlchemy는 db.Model클래스 의 기본에 몇 가지 동작을 추가 하므로 선언적 기반에서 직접 상속하는 모델에는 해당 동작이 없습니다.
Miguel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.