如何在自省SQLModel类时获取外键信息?
如何在自省SQLModel类时获取外键信息?
我之前处理SQLModel生成DBML文件时也踩过这个坑——外键信息确实不像普通字段那样直接从模型属性里拿到,得往SQLAlchemy的底层结构里挖才行,毕竟SQLModel是基于SQLAlchemy做的封装。
先给你理清楚两个关键概念:
- 你代码里的
some_activity_records是ORM层面的Relationship,它只是用来做ORM关联查询的,并不是数据库里实际存在的字段,真正的外键是在关联模型(比如SomeActivity)里定义的带foreign_key参数的字段,比如account_id: str = Field(foreign_key="accounts.id")。 - 要拿到数据库层面的外键约束,得从模型的
__table__属性入手;如果要关联ORM的Relationship信息,就得看__mapper__.relationships。
给你写个实用的函数,能把这两类信息都提取出来:
from sqlmodel import SQLModel def extract_foreign_key_info(model: type[SQLModel]): fk_info = [] # 提取数据库层面的外键约束(对应DB里的FOREIGN KEY定义) for foreign_key in model.__table__.foreign_keys: # 拆分关联的表和字段,比如 "accounts.id" 拆成 ("accounts", "id") target_table, target_field = foreign_key.target_fullname.split(".") fk_info.append({ "type": "database_fk", "local_field": foreign_key.column.name, "target_table": target_table, "target_field": target_field }) # 提取ORM层面的Relationship关联信息 for rel_name, relationship in model.__mapper__.relationships.items(): fk_info.append({ "type": "orm_relationship", "relationship_name": rel_name, "local_fields": [col.name for col in relationship.local_columns], "remote_fields": [col.name for col in relationship.remote_columns], "back_populates": relationship.back_populates }) return fk_info
举个例子,假设你的SomeActivity补全外键字段后是这样:
class SomeActivity(PostgresBase, table=True): __tablename__ = 'some_activity_recs' id: str = Field(default_factory=lambda: genb58_id(22, "activity"), primary_key=True, index=True, nullable=False) # 实际的数据库外键字段 account_id: str = Field(foreign_key="accounts.id", index=True) name: str # ORM关联关系 account: Account = Relationship(back_populates="some_activity_records")
调用extract_foreign_key_info(SomeActivity)就能拿到:
- 数据库层面的外键:
local_field是account_id,关联accounts表的id字段 - ORM层面的Relationship:
relationship_name是account,对应反向关联的some_activity_records
另外提醒一下:如果你的模型里只定义了Relationship但没显式写外键字段,SQLModel会自动生成一个隐式的外键字段(比如account_id),这个字段同样可以通过__table__.columns找到,只是不在你的模型类的显式属性里而已。
备注:内容来源于stack exchange,提问作者havoc1
相关产品推荐
相关产品推荐

