2014-10-22 13 views
7

Dopo un database è costruito in SQLAlchemy, voglio ottenere tutti i modelli, vale a dire, le classi che li rappresentanoOttenere tutti i modelli dal pallone-sqlalchemy db

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

Questo può essere raggiunto? Come?

Posso ottenere le tabelle decentemente, solo non i modelli. Ad esempio:

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

questo dà le tabelle solo non i modelli stessi

risposta

7

Ci sono diverse questioni connesse, ma non ho visto nessun duplicati esatti.

Utilizzando il codice per ottenere i nomi delle tabelle e la risposta accettata di this question per ottenere le classi, è possibile associare le classi ai nomi di tabulazione registrati nel database.

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

Dove models l 'elenco dei modelli Registed sul database.

Il tentativo di cattura è necessario perché un <sqlalchemy.ext.declarative.clsregistry._ModuleMarker object> saranno inclusi nel ciclo for clazz in ..., e non avere un attributo __tablename__.

0

questo funziona nel mio caso: leggermente più corto; più leggibile

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

da dove proviene db_table_creation – codyc4321

3

Se sono necessarie solo le classi, esiste una soluzione più semplice. Sono venuto con esso sulla base di Celeo’s answer:

from flask import current_app 

# This is to be generic (ie. no need to pass your actual SQLAlchemy instance) 
# This way you can include it even in your own extension. 
db = current_app.extensions['sqlalchemy'].db 

[cls for cls in db.Model._decl_class_registry.values() 
if isinstance(cls, type) and issubclass(cls, db.Model)] 

Questo non ha bisogno tutte quelle variabili helper in più, proprio interroga il registro di classe, e filtra tutto ciò che non è un modello.

Problemi correlati