2014-10-22 11 views
7

Nach einer Datenbank in SQLAlchemy aufgebaut ist, möchte ich alle Modelle erhalten, die die Klassen sagen, was sieHolen Sie sich alle Modelle von Kolben-sqlalchemy db

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

dies erreicht werden kann? Wie?

Ich kann die Tabellen anständig erhalten, nur nicht die Modelle. ZB:

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

dies gibt die Tabellen nicht nur die selbst Modelle

Antwort

7

Es gibt mehrere ähnliche Fragen, aber ich habe keine exakte Duplikate.

Mit Ihrem Code, um die Tabellennamen zu erhalten, und this question 's akzeptierte Antwort, um die Klassen zu erhalten, können wir die Klassen zu den Tabellennamen, die in Ihrer Datenbank registriert sind.

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

Wo models die Liste der Modelle ist registed auf Ihrer Datenbank.

Der Try-Catch ist erforderlich, da <sqlalchemy.ext.declarative.clsregistry._ModuleMarker object> in der for clazz in ...-Schleife enthalten ist und kein __tablename__-Attribut aufweist.

0

das funktioniert in meinem Fall: etwas kürzer; besser lesbar

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

woher db_table_creation kommt – codyc4321

3

Wenn Sie nur die Klassen benötigen, gibt es eine einfachere Lösung. Ich kam mit ihm nach oben, basierend auf 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)] 

Dies nicht alle diese zusätzlichen Hilfsvariablen benötigt, nur fragt die Klasse Registrierung und filtert alles, was nicht ein Modell ist.

Verwandte Themen