我有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:在列中混合