Sobes.tech
Back to questions
Junior — Middle
51

Каким образом реализуется наследование моделей при определении ORM-моделей в SQLAlchemy?

Answer from AI

sobes.tech AI

В SQLAlchemy наследование моделей реализуется с помощью обычного наследования классов Python, при этом можно использовать разные стратегии наследования для таблиц в базе данных:

  1. Single Table Inheritance (STI) — все поля базового и дочерних классов хранятся в одной таблице, различие типов записей определяется специальным столбцом (discriminator).

  2. Joined Table Inheritance — для каждого класса создаётся своя таблица, дочерняя таблица содержит только дополнительные поля и ссылается на базовую таблицу через внешний ключ.

  3. Concrete Table Inheritance — каждый класс имеет свою таблицу со всеми полями, включая поля базового класса, без связей между таблицами.

Пример простого наследования с joined table inheritance:

from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import declarative_base, relationship

Base = declarative_base()

class Person(Base):
    __tablename__ = 'person'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    type = Column(String)

    __mapper_args__ = {
        'polymorphic_identity': 'person',
        'polymorphic_on': type
    }

class Employee(Person):
    __tablename__ = 'employee'
    id = Column(Integer, ForeignKey('person.id'), primary_key=True)
    employee_number = Column(String)

    __mapper_args__ = {
        'polymorphic_identity': 'employee',
    }

Таким образом, наследование моделей позволяет удобно организовать структуру данных и логику работы с ними в ORM.