首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从flask-sqlalchemy db获取所有模型

从flask-sqlalchemy db获取所有模型
EN

Stack Overflow用户
提问于 2014-10-23 02:46:09
回答 5查看 13.9K关注 0票数 12

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

代码语言:javascript
复制
>>> db
<SQLAlchemy engine='postgresql:///example'>
>>> ???
[<db.Model 'User'>, <db.Model 'Comment'>, <db.Model 'Article'>]

这是否可以做到呢?多么?

我可以很好地拿到桌子,但不能拿到模型。例如:

代码语言:javascript
复制
>>> for t in db.metadata.tables.items():
        print(t)

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-10-23 06:45:55

有几个相关的问题,但我没有看到任何完全相同的副本。

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

代码语言:javascript
复制
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是在数据库中注册的型号列表。

try catch是必需的,因为<sqlalchemy.ext.declarative.clsregistry._ModuleMarker object>将包含在for clazz in ...循环中,而它没有__tablename__属性。

票数 12
EN

Stack Overflow用户

发布于 2017-06-20 19:10:36

如果您只需要这些类,那么有一个更简单的解决方案。我是在Celeo’s answer的基础上提出的

代码语言:javascript
复制
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)]

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

票数 11
EN

Stack Overflow用户

发布于 2021-06-01 18:45:51

在SQLAlchemy 1.4中,_decl_class_registry.values()方法已删除,您可以改用db.Model.registry.mappers

代码语言:javascript
复制
models = {
    mapper.class_.__name__: mapper.class_
    for mapper in db.Model.registry.mappers
}

有关详细信息,请参阅this issue

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26514823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档