Czy można mieć wielopoziomowy polimorfizm w SQLAlchemy? Oto przykład:Czy wielopoziomowy polimorfizm jest możliwy w SQLAlchemy?
class Entity(Base):
__tablename__ = 'entities'
id = Column(Integer, primary_key=True)
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
entity_type = Column(Unicode(20), nullable=False)
__mapper_args__ = {'polymorphic_on': entity_type}
class File(Entity):
__tablename__ = 'files'
id = Column(None, ForeignKey('entities.id'), primary_key=True)
filepath = Column(Unicode(255), nullable=False)
file_type = Column(Unicode(20), nullable=False)
__mapper_args__ = {'polymorphic_identity': u'file', 'polymorphic_on': file_type)
class Image(File):
__mapper_args__ = {'polymorphic_identity': u'image'}
__tablename__ = 'images'
id = Column(None, ForeignKey('files.id'), primary_key=True)
width = Column(Integer)
height = Column(Integer)
Kiedy zadzwonić Base.metadata.create_all()
, SQLAlchemy podnosi się następujący błąd:
IntegrityError: (IntegrityError) entities.entity_type may not be NULL`.
Ten błąd zniknie jeśli usunąć Image
model i klucz w File
polymorphic_on
.
Co daje?
Możesz mieć więcej szczęścia robiąc to bez deklaratywnej warstwy. – joeforker