Полиморфизм, являясь одним из трех основных столпов объектно-ориентированного программирования (вместе с наследованием и инкапсуляцией), позволяет объектам разных классов обрабатываться как объекты одного класса. SQLAlchemy ORM предлагает продвинутую поддержку полиморфизма, делая ваш код более гибким и читаемым.
Как и во многих ООП-языках, в SQLAlchemy полиморфизм достигается через наследование и оверрайд методов. Это позволяет вам моделировать реальный мир в вашей базе данных, где разные объекты могут вести себя по-разному в зависимости от своих свойств или типа.
Представьте, что у вас есть базовый класс Vehicle
, и вы хотите создать подклассы для Car
и Boat
.
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 Vehicle(Base):
__tablename__ = 'vehicles'
id = Column(Integer, primary_key=True)
type = Column(String(50))
description = Column(String(100))
__mapper_args__ = {
'polymorphic_on': type,
'polymorphic_identity': 'vehicle'
}
class Car(Vehicle):
__mapper_args__ = {
'polymorphic_identity': 'car'
}
doors = Column(Integer)
class Boat(Vehicle):
__mapper_args__ = {
'polymorphic_identity': 'boat'
}
propellers = Column(Integer)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
В приведенном выше коде у нас есть одна таблица vehicles
, но два разных типа объектов (Car
и Boat
), которые наследуются от Vehicle
.
Помимо базового наследования, SQLAlchemy предоставляет набор функций для более продвинутого полиморфизма:
Это позволяет вам запросить базовый класс и автоматически получить объекты производных классов. Возвращенные объекты будут правильного класса (Car
или Boat
в нашем примере).
Session = sessionmaker(bind=engine)
session = Session()
for vehicle in session.query(Vehicle):
print(vehicle.type, vehicle.description)
Это особенно полезно, когда у вас есть отношения между таблицами, и вы хотите, чтобы ассоциированный объект был определенного полиморфного типа. Например, у вас может быть класс Driver
, который связан с Vehicle
, но в зависимости от контекста он может водить как Car
, так и Boat
.
Для настоящей гибкости ваши отношения могут быть связаны с любым типом объекта, и SQLAlchemy может автоматически определить, с каким типом объекта вы работаете. Это особенно полезно для создания более обобщенных отношений и запросов.
Полиморфизм в SQLAlchemy ORM предоставляет разработчикам интуитивно понятные и гибкие инструменты для моделирования реального мира в структуре базы данных. Понимание и правильное использование полиморфизма может сделать ваш код более эффективным, читаемым и гибким, позволяя легко адаптироваться к изменяющимся требованиям вашего приложения.
Содержание: