डिक्लेरेटिव_बेस () और db.Model में क्या अंतर है?


86

त्वरित प्रारंभ ट्यूटोरियल कुप्पी के SQLAlchemy प्लगइन का निर्देश उन इनहेरिट तालिका मॉडल बनाने के लिए के लिए db.Modelवर्ग, जैसे

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

हालाँकि, SQLAlchemy ट्यूटोरियल और बोतल-SQLAlchemy README दोनों का सुझाव है कि तालिका मॉडल Baseसे एक तात्कालिकता विरासत में मिली declarative_base()

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

इन दोनों दृष्टिकोणों में क्या अंतर है?

जवाबों:


84

फ्लास्क- 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

_BoundDeclarativeMetaMetaclass SQLAlchemy के एक उपवर्ग है DeclarativeMeta, यह बस के लिए एक डिफ़ॉल्ट मान की गणना के लिए समर्थन जोड़ता है __tablename__(तालिका नाम) है और यह भी संभाल बांधता है।

base.queryसंपत्ति कुप्पी के SQLAlchemy आधारित मॉडल के रूप में एक प्रश्न वस्तु का उपयोग करने के लिए सक्षम बनाता है Model.querySQLAlchemy के बजाय session.query(Model)

_QueryPropertyक्वेरी वर्ग भी SQLAlchemy की क्वेरी से subclassed है। कुप्पी के SQLAlchemy उपवर्ग तीन अतिरिक्त क्वेरी तरीकों कि SQLAlchemy में मौजूद नहीं है कहते हैं: get_or_404(), first_or_404()और paginate()

मेरा मानना ​​है कि ये केवल अंतर हैं।


1
मैं बस इस ऐप के लिए आज खोज रहा था जो मैं एक साल से बना रहा हूं, मूल रूप से आपके "मेगा फ्लास्क ट्यूटोरियल" पर आधारित है, जो बेस = Declarative_Base का उपयोग करने के बजाय स्पष्ट रूप से db.Model का उपयोग करता है। मैं भ्रमित हो गया क्योंकि मेरे मॉडल सभी स्पष्ट रूप से घोषणा विस्तार का उपयोग करते हैं लेकिन फिर भी मैंने कभी घोषणात्मक_बेस () नहीं कहा। महान विवरण के लिए धन्यवाद!
चोकोमोंकी

क्या यह संभव है db.Model को एक यूजर मॉडल और एड्रेस मॉडल में आधार का उपयोग करना। उदाहरण के लिए: - क्लास यूजर (db.Model), क्लास एड्रेस (बेस)?
सैफ अली करेडिया

यकीन नहीं हो रहा है, लेकिन मेरा अनुमान है कि कुछ चीजें काम करने वाली नहीं हैं। फ्लास्क-SQLAlchemy db.Modelवर्ग में कुछ व्यवहार को आधार से जोड़ता है , इसलिए किसी भी मॉडल जो सीधे घोषणा के आधार से विरासत में मिलते हैं, वे नहीं होने वाले हैं।
मिगेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.