Flask 从Alchemy db获取所有模型

Flask 从Alchemy db获取所有模型,flask,sqlalchemy,flask-sqlalchemy,Flask,Sqlalchemy,Flask Sqlalchemy,在SQLAlchemy中构建数据库之后,我想获得所有的模型,也就是说,表示它们的类 >>> db <SQLAlchemy engine='postgresql:///example'> >>> ??? [<db.Model 'User'>, <db.Model 'Comment'>, <db.Model 'Article'>] 这就给出了表格,而不是模型本身有几个相关的问题,但我没有看到任何精确的副本 使用您的

在SQLAlchemy中构建数据库之后,我想获得所有的模型,也就是说,表示它们的类

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

这就给出了表格,而不是模型本身

有几个相关的问题,但我没有看到任何精确的副本

使用您的代码获取表名,并使用您接受的答案获取类,我们可以将类与数据库中注册的表名相匹配

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
是数据库中注册的模型列表

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

try catch是必需的,因为
将包含在
for clazz in…
循环中,并且它没有
\uuuu tablename\uuuu
属性;可读性更强

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

如果您只需要这些类,那么有一个更简单的解决方案。我是基于以下几点提出的:

这不需要所有这些额外的辅助变量,只需查询类注册表,并过滤掉所有非模型的内容。

以下是我的变体,包括键入和简洁的中间步骤:

from ??? import db  # Import from wherever you have this, or use GergelyPolonkai's method to get a db object.
from typing import List, Dict, Union
from flask_sqlalchemy import DefaultMeta
from sqlalchemy.ext.declarative.clsregistry import _ModuleMarker

registered_classes: List[Union[DefaultMeta, _ModuleMarker]] = \
    [x for x in db.Model._decl_class_registry.values()]
registered_models: List[DefaultMeta] = \
    [x for x in registered_classes if isinstance(x, DefaultMeta)]
tables: List[DefaultMeta] = \
    [x for x in registered_models if hasattr(x, '__tablename__')]

在SQLAlchemy 1.4中,删除了
\u decl\u class\u registry.values()
方法,您可以使用
db.Model.registry.mappers

models = {
    mapper.class_.__name__: mapper.class_
    for mapper in db.Model.registry.mappers
}

有关详细信息,请参见。

db_表的创建来自何方
models = {
    mapper.class_.__name__: mapper.class_
    for mapper in db.Model.registry.mappers
}