SQLAlchemy, будучи мощным инструментом ORM, предоставляет несколько стратегий наследования, чтобы ваши модели данных могли отразить этот ООП подход в вашей базе данных.
В SQLAlchemy существует три основные стратегии наследования: единая таблица, конкретная таблица и соединенная таблица.
В этой стратегии все классы наследования хранятся в одной таблице базы данных. SQLAlchemy использует дополнительное поле для определения, к какому типу объекта принадлежит каждая запись.
Пример:
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class Person(Base):
__tablename__ = 'persons'
id = Column(Integer, primary_key=True)
type = Column(String)
name = Column(String)
class Student(Person):
grade = Column(String)
class Teacher(Person):
subject = Column(String)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
Здесь для каждого класса создается отдельная таблица. Базовый класс и производные классы связаны через внешний ключ.
Пример:
class Person(Base):
__tablename__ = 'persons'
id = Column(Integer, primary_key=True)
name = Column(String)
type = Column(String)
__mapper_args__ = {
'polymorphic_identity':'person',
'polymorphic_on':type
}
class Student(Person):
__tablename__ = 'students'
id = Column(Integer, ForeignKey('persons.id'), primary_key=True)
grade = Column(String)
__mapper_args__ = {
'polymorphic_identity':'student',
}
class Teacher(Person):
__tablename__ = 'teachers'
id = Column(Integer, ForeignKey('persons.id'), primary_key=True)
subject = Column(String)
__mapper_args__ = {
'polymorphic_identity':'teacher',
}
Base.metadata.create_all(engine)
В этой стратегии каждый класс имеет свою таблицу, и таблицы не связаны между собой. Вся информация для объекта хранится в его таблице.
Пример:
class Person(Base):
id = Column(Integer, primary_key=True)
name = Column(String)
class Student(Person):
__tablename__ = 'students'
id = Column(Integer, ForeignKey('persons.id'), primary_key=True)
grade = Column(String)
class Teacher(Person):
__tablename__ = 'teachers'
id = Column(Integer, ForeignKey('persons.id'), primary_key=True)
subject = Column(String)
Base.metadata.create_all(engine)
JOIN
операций при запросе к подклассам.Как и любой инструмент или подход, наследование в ORM имеет свои преимущества и недостатки:
Преимущества:
Недостатки:
JOIN
операций.Наследование в SQLAlchemy ORM позволяет эффективно моделировать иерархии объектов в вашей базе данных. В зависимости от ваших требований и особенностей данных, вы можете выбрать наиболее подходящую стратегию наследования, чтобы обеспечить эффективное и гибкое представление данных в вашем приложении.
Содержание: