在SQLAlchemy中构建数据库后,我希望获得所有模型,也就是表示它们的类
>>> db
<SQLAlchemy engine='postgresql:///example'>
>>> ???
[<db.Model 'User'>, <db.Model 'Comment'>, <db.Model 'Article'>]
这是否可以做到呢?多么?
我可以很好地拿到桌子,但不能拿到模型。例如:
>>> for t in db.metadata.tables.items():
print(t)
这就给出了表,而不是模型本身
发布于 2014-10-23 06:45:55
有几个相关的问题,但我没有看到任何完全相同的副本。
使用您的代码获取表名,使用this question接受的答案获取类,我们可以将类与数据库中注册的表名进行匹配。
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__
属性。
发布于 2017-06-20 19:10:36
如果您只需要这些类,那么有一个更简单的解决方案。我是在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)]
这不需要所有这些额外的帮助变量,只需查询类注册表,并过滤掉所有不是模型的内容。
发布于 2021-06-01 18:45:51
在SQLAlchemy 1.4中,_decl_class_registry.values()
方法已删除,您可以改用db.Model.registry.mappers
:
models = {
mapper.class_.__name__: mapper.class_
for mapper in db.Model.registry.mappers
}
有关详细信息,请参阅this issue。
https://stackoverflow.com/questions/26514823
复制相似问题