5.4 Отношения таблиц в SQLAchemy
4 из 4 шагов пройдено

Понимание самоссылающихся таблиц

Самоссылающаяся таблица(self-referential) - это таблица, которая ссылается на себя через внешний ключ. Для отношений категория-подкатегория это означает наличие единой таблицы, где каждая запись может указывать на свою родительскую категорию.

Вот как мы можем определить такую таблицу с помощью SQLAlchemy, изменим код в models/category.py

from app.backend.db import Base
from sqlalchemy import Column, Integer, String, Boolean, ForeignKey
from sqlalchemy.orm import relationship
from app.models.products import Product


class Category(Base):
    __tablename__ = 'categories'

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String)
    slug = Column(String, unique=True, index=True)
    is_active = Column(Boolean, default=True)
    parent_id = Column(Integer, ForeignKey('categories.id'), nullable=True)

    products = relationship("Product", back_populates="category")

Отношения в такой таблице определяются двумя полями:

  • id (первичный ключ)
  • parent_id (внешний ключ, может быть пустым)

Обратите внимание, что parent_id - это внешний ключ, который ссылается на одну и ту же таблицу. 

Когда мы будем добавлять категорию в таблицу, нам нужно установить parent_id как Nullчтобы установить категорию как главную, или добавить parent_id как id любой другой категории, чтобы сделать  ее подкатегорией.

В результате мы получим следующие SQL инструкции для таблицы категорий:

CREATE TABLE categories (
	id INTEGER NOT NULL, 
	name VARCHAR, 
	slug VARCHAR, 
	is_active BOOLEAN, 
	parent_id INTEGER, 
	PRIMARY KEY (id), 
	FOREIGN KEY(parent_id) REFERENCES categories (id)
)

Эта таблица будет иметь следующую схему:

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

На данный момент мы будем работать с этими двумя моделями, далее по курсу мы будем постоянно дорабатывать их и дорабатывать функционал нашего проекта.

Мы видим что у наших таблиц появилась связь, в следующем разделе мы научимся создавать таблицы посредством SQLAlchemy и научимся выполнять миграции через Alembic.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Нет обсуждений. Начните первое.