Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Модель данных в ORM
ORM (Object-Relational Mapping) — это технология, которая преобразует данные из реляционной БД в объекты программирования. Модель данных в ORM — это класс Python, который представляет таблицу БД, где атрибуты класса соответствуют столбцам таблицы.
Что такое модель?
Модель — это объявление структуры данных, которое содержит:
- Названия и типы полей
- Связи между таблицами (relations)
- Ограничения (constraints)
- Методы работы с данными
Пример с SQLAlchemy ORM
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from datetime import datetime
Base = declarative_base()
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
name = Column(String(100), nullable=False)
email = Column(String(100), unique=True, nullable=False)
created_at = Column(DateTime, default=datetime.utcnow)
# Связь с другой таблицей
posts = relationship("Post", back_populates="author")
class Post(Base):
__tablename__ = "posts"
id = Column(Integer, primary_key=True)
title = Column(String(200), nullable=False)
content = Column(String(5000))
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
created_at = Column(DateTime, default=datetime.utcnow)
author = relationship("User", back_populates="posts")
Связи в ORM
One-to-Many (один ко многим):
class Author(Base):
__tablename__ = "authors"
id = Column(Integer, primary_key=True)
books = relationship("Book", back_populates="author")
class Book(Base):
__tablename__ = "books"
id = Column(Integer, primary_key=True)
author_id = Column(Integer, ForeignKey("authors.id"))
author = relationship("Author", back_populates="books")
Many-to-Many (многие ко многим):
from sqlalchemy import Table
association_table = Table(
'student_course',
Base.metadata,
Column('student_id', Integer, ForeignKey('students.id')),
Column('course_id', Integer, ForeignKey('courses.id'))
)
class Student(Base):
__tablename__ = "students"
id = Column(Integer, primary_key=True)
name = Column(String(100))
courses = relationship("Course", secondary=association_table)
class Course(Base):
__tablename__ = "courses"
id = Column(Integer, primary_key=True)
title = Column(String(100))
Использование моделей
from sqlalchemy.orm import Session
# Создание записи
new_user = User(
name="Alice",
email="alice@example.com"
)
session.add(new_user)
session.commit()
# Чтение
user = session.query(User).filter(User.email == "alice@example.com").first()
# Обновление
user.name = "Alice Smith"
session.commit()
# Удаление
session.delete(user)
session.commit()
# Работа со связями
posts = user.posts # Автоматически загружаются связанные посты
for post in posts:
print(post.title)
Типы полей
from sqlalchemy import String, Integer, Float, Boolean, DateTime, JSON, Enum
class Product(Base):
__tablename__ = "products"
id = Column(Integer, primary_key=True)
name = Column(String(100)) # Строка
price = Column(Float) # Число с плавающей точкой
quantity = Column(Integer) # Целое число
is_active = Column(Boolean) # Булево значение
created_at = Column(DateTime) # Дата и время
metadata = Column(JSON) # JSON
status = Column(Enum('active', 'inactive')) # Enum
Миграции и модели
ОRM модели описывают структуру БД в коде, но для реальной базы используются миграции (например, Alembic или Goose), которые создают таблицы на основе моделей.
Преимущества ORM моделей
- Объектно-ориентированный подход — работа с объектами вместо SQL
- Безопасность от SQL-injection — автоматическое экранирование
- Переносимость — одна модель работает с разными БД
- Удобство — автоматическое преобразование типов
- Отношения — встроенная работа со связями
Вывод: Модель в ORM — это декларативное описание структуры БД на Python, которое обеспечивает удобный и безопасный способ работы с данными в приложении.