sqlAlchemy,具体继承,但父类有foreignKey

Ber*_*ala 9 python sqlalchemy

我有3个班:

  • 用户
  • 员工< - 数据库中不需要
  • 经理

Manager继承自Employee.用户表是相关的继承.

到现在为止还挺好:

class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    email = Column(String(255))

class Employee(AbstractConcreteBase, Base):
    name = Column(String(30))

class Manager(Employee):
    __tablename__ = 'manager'
    employee_id = Column(Integer, primary_key=True)
    dept = Column(String(30))
    __mapper_args__ = {'polymorphic_identity':'manager', 'concrete':True}
Run Code Online (Sandbox Code Playgroud)

它创建了User和Manager,这就是我想要的.

但,

如果我们在父类中引入ForeignKey,上面会中断:

class Employee(AbstractConcreteBase, Base):
    name = Column(String(30))
    user_id = Column(Integer, ForeignKey('user.id'))        
Run Code Online (Sandbox Code Playgroud)

错误是:

sqlalchemy.exc.InvalidRequestError:

Columns with foreign keys to other columns must be declared as @declared_attr callables on declarative mixin classes.
Run Code Online (Sandbox Code Playgroud)

到目前为止,我不理解mixin docs(链接)

在基类中允许外键(在本例中为Employee)需要什么?

Yon*_*Yon 15

你可以像这样使用mixin:

from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.declarative import declared_attr


Base = declarative_base()

class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    email = Column(String(255))

class Employee(object):
    name = Column(String(30))
    @declared_attr
    def user_id(cls):
        return Column(Integer, ForeignKey('user.id'))

class Manager(Base, Employee):
    __tablename__ = 'manager'
    employee_id = Column(Integer, primary_key=True)
    dept = Column(String(30))
    __mapper_args__ = {'polymorphic_identity':'manager', 'concrete':True}
Run Code Online (Sandbox Code Playgroud)

ref:在列中混合

  • 在这种情况下你将如何设置 user_id ?`manager = Manager()` 那么 `manager.user_id = 2` 将不起作用..您绝对需要使用同义词和 getter/setter 吗? (2认同)