Как мы уже помним из раздела подключения к БД, мы уже установили базовый класс.
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 CreateTableprint(CreateTable(Category.__table__))но, после запуска сервера, никаких сообщений не вижу, что я делаю не так?
@Алексей_Бойко, нужно запустить не сервер, а именно этот файл. Если работаете через пайчарм, то находясь в этом файле, сверху выбираем "Current File" и жмем кнопку запуска.
@Илья_Перминов, Спасибо!