Sự khác biệt giữa statement_base () và db.Model là gì?


83

Các QuickStart hướng dẫn cho Flask-SQLAlchemy Plugin người dùng chỉ thị để tạo ra mô hình bảng kế thừa các db.Modellớp, ví dụ:

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

Tuy nhiên, hướng dẫn SQLAlchemy và chai-SQLAlchemy README đều gợi ý rằng các mô hình bảng kế thừa một Basekhởi tạo từ declarative_base().

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

Sự khác biệt giữa hai cách tiếp cận này là gì?

Câu trả lời:


80

Nhìn vào mã nguồn Flask-SQLAlchemy, db.Modellớp được khởi tạo như sau:

self.Model = self.make_declarative_base()

Và đây là make_declarative_base()phương pháp:

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

Siêu kính _BoundDeclarativeMetalà một lớp con của SQLAlchemy's DeclarativeMeta, nó chỉ đơn giản là bổ sung hỗ trợ tính toán giá trị mặc định cho __tablename__(tên bảng) và cũng để xử lý các liên kết.

Các base.querybất động sản cho phép Flask-SQLAlchemy mô hình dựa để truy cập một đối tượng truy vấn như Model.querythay vì SQLAlchemy của session.query(Model).

Lớp _QueryPropertytruy vấn cũng được phân lớp từ truy vấn của SQLAlchemy. Các Flask-SQLAlchemy lớp con thêm ba phương pháp truy vấn bổ sung mà không tồn tại trong SQLAlchemy: get_or_404(), first_or_404()paginate().

Tôi tin rằng đây là những khác biệt duy nhất.


1
Hôm nay tôi vừa mới tìm kiếm ứng dụng này mà tôi đã xây dựng được một năm hoặc lâu hơn, ban đầu dựa trên "Hướng dẫn Mega Flask" của bạn, sử dụng db.Model thay vì sử dụng Base = Decl Compare_Base một cách rõ ràng. Tôi đã bối rối vì các mô hình của tôi rõ ràng đều sử dụng tiện ích mở rộng Khai báo nhưng tôi chưa bao giờ gọi tên khai báo (). Cảm ơn vì lời giải thích tuyệt vời!
Chockomonkey

Có thể sử dụng db.Model trong một Mô hình Người dùng và Cơ sở trong Mô hình Địa chỉ. Ví dụ: - class User (db.Model), class Address (Base)?
Saif ali Karedia

Không chắc chắn, nhưng tôi đoán là một số thứ sẽ không hoạt động. Flask-SQLAlchemy thêm một số hành vi vào cơ sở trong db.Modellớp, vì vậy bất kỳ mô hình nào kế thừa trực tiếp từ cơ sở khai báo sẽ không có điều đó.
Miguel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.