flask - फ्लास्क-क्केल्लेमी डीबी से सभी मॉडल प्राप्त करें




sqlalchemy flask-sqlalchemy (2)

यह मेरे मामले में काम करता है: थोड़ा छोटा; अधिक पठनीय

models = []
for name, thing in db_table_creation.__dict__.iteritems():
    if isinstance(thing, sqlalchemy.ext.declarative.DeclarativeMeta) and hasattr(thing, '__tablename__'):
        models.append(thing)

एक डेटाबेस एसक्यूएललेमी में बनाया जाने के बाद, मैं सभी मॉडलों को प्राप्त करना चाहता हूं, जो कहना है कि उन वर्गों का प्रतिनिधित्व करते हैं

>>> db
<SQLAlchemy engine='postgresql:///example'>
>>> ???
[<db.Model 'User'>, <db.Model 'Comment'>, <db.Model 'Article'>]

क्या यह हासिल किया जा सकता है? कैसे?

मैं तालिकाओं को विनम्रता से प्राप्त कर सकता हूं, बस मॉडल नहीं। उदाहरण के लिए:

>>> for t in db.metadata.tables.items():
        print(t)

यह तालिकाओं को सिर्फ खुद ही मॉडल नहीं देता है


कई संबंधित प्रश्न हैं, लेकिन मुझे कोई सटीक डुप्लिकेट नहीं मिला

टेबल के नाम पाने के लिए अपने कोड का उपयोग करना, और कक्षाओं को प्राप्त करने के लिए इस प्रश्न का स्वीकृत उत्तर, हम वर्गों को उन टेबलेनामों से मेल कर सकते हैं जो आपके डेटाबेस पर पंजीकृत हैं।

classes, models, table_names = [], [], []
for clazz in db.Model._decl_class_registry.values():
    try:
        table_names.append(clazz.__tablename__)
        classes.append(clazz)
    except:
        pass
for table in db.metadata.tables.items():
    if table[0] in table_names:
        models.append(classes[table_names.index(table[0])])

जहां models आपके डेटाबेस पर पंजीकृत मॉडल की सूची है

कोशिश पकड़ने की आवश्यकता है क्योंकि <sqlalchemy.ext.declarative.clsregistry._ModuleMarker object> में __tablename__ के for clazz in ... लूप for clazz in ... शामिल किया जाएगा, और इसमें एक __tablename__ विशेषता नहीं है।