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
相关产品推荐
相关产品推荐

