gpt4 book ai didi

python - 将 SQLAlchemy 数据库打印为模型和关系的好方法是什么?

转载 作者:太空狗 更新时间:2023-10-30 02:45:02 25 4
gpt4 key购买 nike

这可能是一个挑战,但我正试图找到一种很好的方法来全面了解我的整个数据库的“外观”。这是一个使用 Flask-SQLAlchemy 的小例子,一些具有不同关系和属性的模型(无可否认,大部分只是从 SQLAlchemy 文档中获取)

class IDModel(db.Model):
__abstract__ = True
id = db.Column(db.Integer, primary_key=True)

class User(db.Model, IDModel):
__tablename__ = 'users'
username = db.Column(db.String(64), unique=True)
_roles = db.relationship(
Role, lambda: user_role, collection_class=set,
backref=db.backref('users', collection_class=set)
)
roles = association_proxy('_roles', 'name')

# One-to-many
class Post(db.Model, IDModel):
__tablename__ = 'posts'
html = db.Column(db.Text)
author_id = db.Column(db.Integer, backref="users.id")
author = db.relationship("User")

# Many-to-Many
class Role(db.Model, IDModel):
__tablename__ = 'roles'
name = db.Column(db.String)

user_role = db.Table(
'user_role',
db.Column('user_id', db.Integer, db.ForeignKey(User.id), primary_key=True),
db.Column('role_id', db.Integer, db.ForeignKey(Role.id), primary_key=True)
)

理想情况下,我想要做的是更改我的数据库的 __repr__ 以针对给定的数据库打印如下内容:

<Model 'User'>
id (primary key)
username
roles -> MANY-TO-MANY relationship with <Model 'Roles'>

<Model 'Post'>
id (primary_key)
html
author_id -> 'User.id'
author -> ONE-TO-MANY relationship with <Model 'User'>

<Model 'Role'>
id (primary key)
name
MANY TO MANY relationship with <Model 'User'>

这样的事情可能吗?

为了补充我的贡献,我能够让它打印所有表及其列,但在打印关系和删除关系表时遇到了麻烦。

>>> from app import db
>>> inspector = db.inspect(db.engine)
>>> for table in inspector.get_table_names():
print("<Model '{}'".format(table))
for column in inspector.get_columns(table):
print(column['name'])

最佳答案

你不需要反射(reflect)数据库来做这件事;您可以改为检查每个模型。要获取从 Base 继承的所有模型的列表:

Base.__subclasses__()

然后,获取特定模型的列列表,例如User,你可以看看mapper:

User.__mapper__.attrs

其中每一个都可以是 ColumnPropertyRelationshipProperty。对于一个ColumnProperty,你可以获得Column对象(它实际上是一个Column的列表,但我认为很少有超过一个的):

prop.columns[0]

Column 对象包含您在声明模型时定义的所有信息,包括它是主键 (c.primary_key) 还是外键 ( c.foreign_keys).

对于RelationshipProperty,您可以使用c.mapper 获取远程端的映射器。要获取该类,您可以执行 c.mapper.class_。您还可以使用 c.direction 找到方向。

综合起来:

for model in Base.__subclasses__():
print "<model {}>".format(model.__name__)
for a in model.__mapper__.attrs:
if isinstance(a, ColumnProperty):
c = a.columns[0]
line = a.key
if c.primary_key:
line += " (primary key)"
if c.foreign_keys:
line += " -> " + ", ".join([fk.target_fullname for fk in c.foreign_keys])
print line
elif isinstance(a, RelationshipProperty):
print "{} -> {} relationship with <model {}>".format(
a.key, a.direction.name, a.mapper.class_.__name__)
print ""

关于python - 将 SQLAlchemy 数据库打印为模型和关系的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26147410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com