SQLAlchemy继承类无法通过__table_args__设置schema的解决方案咨询
解决SQLAlchemy继承类无法指定__table_args__的问题
你遇到的问题根源在于单表继承的机制:你的Employee类没有定义自己的__tablename__,SQLAlchemy会将它视为父类User的单表继承子类——所有数据都存在user表中,子类本身没有独立的数据库表,自然不能用__table_args__指定schema。
要实现Employee类对应foo schema下的表,你需要改用联合表继承(Joined Table Inheritance),让子类拥有自己的独立表,同时继承父类的字段。下面是具体的解决方案:
修改后的代码示例
import sqlalchemy as sa from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = 'user' id = sa.Column(sa.Integer, primary_key=True) full_name = sa.Column(sa.Text, nullable=False) # 添加多态标识字段,用于区分不同类型的用户(可选但推荐) type = sa.Column(sa.String(50)) __mapper_args__ = { 'polymorphic_on': type, # 指定多态判断字段 'polymorphic_identity': 'user' # 父类的多态标识 } class Employee(User): __tablename__ = 'employee' # 这里可以正常指定schema了,因为子类有自己的表 __table_args__ = {'schema': 'foo'} # 必须定义与父表主键关联的外键作为子类的主键 id = sa.Column(sa.Integer, sa.ForeignKey('user.id'), primary_key=True) company_id = sa.Column(sa.Integer) __mapper_args__ = { 'polymorphic_identity': 'employee' # 子类的多态标识 }
方案说明
- 给子类添加
__tablename__:这会让Employee在fooschema下生成独立的employee表,不再共享父类的user表。 - 关联父表主键:子类的
id字段作为外键关联父表user.id,同时作为自己的主键,这是联合表继承的核心要求,用于关联父类和子类的数据。 - 多态标识(可选):如果需要在查询父类
User时自动区分普通用户和员工,polymorphic_on和polymorphic_identity可以帮你实现自动的多态查询。如果不需要多态特性,也可以去掉这些配置,但联合表继承的核心结构(子类表+外键关联)必须保留。
这样修改后,Employee类就会对应foo.employee表,同时继承User类的full_name字段,查询Employee时SQLAlchemy会自动关联user表获取父类字段的数据。
内容的提问来源于stack exchange,提问作者vpoulain
相关产品推荐
相关产品推荐

