5.3 Введение в модели SQLAlchemy
4 из 4 шагов пройдено

Как мы уже помним из раздела подключения к БД, мы уже установили базовый класс.

class Base(DeclarativeBase):
    pass

Так как мы руководствуемся концепцией чистой архитектуры, все модели мы будем хранить в отдельной папке и отдельных файлах, нам будет удобнее его импортировать в каждую модель.

Создадим новую папку models в папке нашего проекта, и добавим в нее 2 файла: category.py и products.py, которые будут хранить модели SQLAlchemy категорий и продуктов

В файл category.py добавим следующий код модели:

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


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)

Класс Category является моделью SQLAlchemy, поскольку он наследует свойства базового класса. Это сопоставленный класс, поскольку все его атрибуты являются отражением метаданных столбца его физической схемы таблицы. В модели для поля id и его свойства primary_key установлено значение True, поскольку SQLAlchemy рекомендует, чтобы каждая схема таблицы имела хотя бы один первичный ключ. Остальные объекты Column сопоставляются с метаданными столбца, которые не являются первичными, но могут быть уникальными или индексироваться. Каждый класс модели наследует свойство tablename, которое задает имя отображаемой таблицы.

А в файл products.py добавим код модели наших товаров:

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


class Product(Base):
    __tablename__ = 'products'

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String)
    slug = Column(String, unique=True, index=True)
    description = Column(String)
    price = Column(Integer)
    image_url = Column(String)
    stock = Column(Integer)
    rating = Column(Float)
    is_active = Column(Boolean, default=True)

На данном этапе мы можем запустить наши модели, чтобы проверить, какой SQL код генерирует SQLAlchemy. Для этого можно добавить после моделей подобный код:

from sqlalchemy.schema import CreateTable
print(CreateTable(Category.__table__))

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

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

И выполним подобный код для модели продуктов, и получим следующую инструкцию для создания таблицы в БД:

CREATE TABLE products (
	id INTEGER NOT NULL, 
	name VARCHAR, 
	slug VARCHAR, 
	description VARCHAR, 
	price INTEGER, 
	image_url VARCHAR, 
	stock INTEGER, 
	rating FLOAT, 
	is_active BOOLEAN, 
	PRIMARY KEY (id)
)

Самые внимательные заметят, что у нас есть модель категорий и продуктов, но они никак не связаны друг с другом. В следующем шаге мы попробуем решить эту проблему.


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

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

Коллеги! Прошу прощения, затупил,  добавил "categty.py" необходимую инструкцию по выводу на экран

from sqlalchemy.schema import CreateTable

print(CreateTable(Category.__table__))

но, после запуска сервера, никаких сообщений не вижу, что я делаю не так?

@Алексей_Бойко, нужно запустить не сервер, а именно этот файл. Если работаете через пайчарм, то находясь в этом файле, сверху выбираем "Current File" и жмем кнопку запуска.

@Илья_Перминов, Спасибо!

from app.backend.db import Base
ModuleNotFoundError: No module named 'app'

Мне выдает такую ошибку. Можете, пожалуйста, подсказать в чем проблема? Использую VS Code. В PyCharm нормально запускается.

Изменен Евгений Братенков

@Евгений_Братенков, Попробуйте почитать вот тут.

@Илья_Перминов, Спасибо огромное. Это помогло решить проблему))

@Илья_Перминов, f