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

SQLAlchemy如何动态设置__tablename__实现同结构多表映射

解决方案

你可以通过动态模型工厂函数实现需求,SQLAlchemy的声明式映射会在类定义阶段读取__tablename__配置完成表绑定,因此你需要在运行时按需生成独立的模型类,而非修改已定义类的属性。

实现代码

from sqlalchemy import Column, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

# 定义模型生成工厂
def create_todo_model(table_name: str):
    class ToDoList(Base):
        __tablename__ = table_name
        id = Column(String, primary_key=True)
        title = Column(String)

        def __init__(self, id, title):
            self.id = id
            self.title = title
    return ToDoList

使用示例

# 生成对应不同表的模型类
TodayTodo = create_todo_model("TodayTodo")
TomorrowTodo = create_todo_model("TomorrowToDo")

# 实例化、操作和普通ORM类完全一致
# 新增今日待办
today_item = TodayTodo(id="001", title="完成项目文档")
session.add(today_item)

# 新增明日待办
tomorrow_item = TomorrowTodo(id="001", title="参加需求评审")
session.add(tomorrow_item)

注意事项

  • 工厂生成的每个模型类完全独立,分别映射到对应表,不会互相干扰
  • 如果需要自动建表,要先生成所有需要的模型类,再执行Base.metadata.create_all(engine)
  • 不要直接修改原有静态ToDoList类的__tablename__属性,该操作不会更新已经完成的ORM映射,会导致操作错误

内容的提问来源于stack exchange,提问作者Kshitij Kohli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:57:01