You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自省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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 15:14:31