单表继承(Single Table Inheritance)是一种ORM(对象关系映射)设计模式,它在一个数据库表中存储所有继承层次结构的实体。在这种模式下,每个具体的子类都会在同一个表中拥有自己的字段,同时还有一个字段用来区分不同的子类类型。这个用来区分类型的字段通常被称为“类型标识符”或“discriminator”。
附加类名通常指的是在单表继承中,用于区分不同子类的字段,这个字段的值通常是子类的名称或者一个代表该子类的唯一标识。
问题:在使用单表继承时,可能会遇到字段冗余、更新异常等问题。
原因:
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class Animal(Base):
__tablename__ = 'animals'
id = Column(Integer, primary_key=True)
type = Column(String(50)) # Discriminator column
name = Column(String(50))
class Dog(Animal):
__mapper_args__ = {
'polymorphic_identity': 'dog',
}
breed = Column(String(50))
class Cat(Animal):
__mapper_args__ = {
'polymorphic_identity': 'cat',
}
color = Column(String(50))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
# Adding records
dog = Dog(name='Buddy', breed='Golden Retriever')
cat = Cat(name='Whiskers', color='Black')
session.add_all([dog, cat])
session.commit()
# Querying records
animals = session.query(Animal).all()
for animal in animals:
if isinstance(animal, Dog):
print(f'Dog: {animal.name}, Breed: {animal.breed}')
elif isinstance(animal, Cat):
print(f'Cat: {animal.name}, Color: {animal.color}')
在这个例子中,type
字段就是附加类名,用于区分不同的动物类型。通过设置__mapper_args__
中的polymorphic_identity
,SQLAlchemy知道如何将数据库中的记录映射到正确的类实例。
领取专属 10元无门槛券
手把手带您无忧上云