SQLAlchemy — это гибкая и мощная библиотека для работы с базами данных в Python. В то время как её ORM-компонент часто находится в центре внимания, компонент Core может быть исключительно полезным для тех, кто ищет больший контроль над генерируемым SQL и схемой базы данных.
SQLAlchemy Core предоставляет способ представления и взаимодействия со схемой базы данных и SQL-запросами. Он рассматривает базу данных как набор таблиц, которые в свою очередь состоят из столбцов, индексов и ограничений. С помощью Core вы можете создавать, изменять и удалять таблицы, а также формировать и выполнять запросы к данным.
Для того чтобы работать с таблицей в SQLAlchemy Core, её необходимо сначала определить. Это делается с использованием класса Table
.
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
# Создаем метаданные и движок
metadata = MetaData()
engine = create_engine('sqlite:///mydatabase.db')
# Определяем таблицу
users = Table('users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String),
Column('age', Integer)
)
В приведенном выше примере определяется таблица users с тремя столбцами: id
, name
и age
.
Столбцы в таблице определяются с помощью объекта Column
, который принимает имя столбца, тип данных и дополнительные аргументы, такие как ограничения.
from sqlalchemy import Float, DateTime, Text
articles = Table('articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String(100)),
Column('content', Text),
Column('rating', Float),
Column('published_at', DateTime)
)
Основные типы данных:
Integer
: Целочисленный тип данных. Подходит для хранения целых чисел.Column('user_id', Integer)
String
: Строка переменной длины. Можно указать максимальную длину.Column('username', String(15)) # строка максимальной длиной в 15 символов
Text
: Строка для хранения больших текстовых блоков. Без ограничения длины.Column('description', Text)
DateTime
: Тип данных для хранения даты и времени.from sqlalchemy import DateTime
Column('created_at', DateTime)
Float
: Тип данных для хранения чисел с плавающей точкой.Column('rating', Float)
Boolean
: Тип данных для хранения логических значений True
или False
.from sqlalchemy import Boolean
Column('is_active', Boolean)
SQLAlchemy поддерживает множество других типов данных, таких как:
Date
: Только для хранения даты (без времени).Time
: Только для хранения времени (без даты).LargeBinary
: Для хранения двоичных данных.Unicode
: Строковый тип для хранения символов Unicode.Enum
: Для хранения одного из предварительно определенных значений.При проектировании структуры базы данных особое внимание следует уделять ограничениям и атрибутам столбцов, так как они играют важную роль в обеспечении целостности данных. SQLAlchemy Core предоставляет ряд инструментов для этой цели.
Column('id', Integer, primary_key=True)
Column('email', String(100), unique=True)
nullable
определяет, может ли столбец содержать значения NULL
. Если nullable=False
, то столбец не может содержать значение NULL
.Column('username', String(50), nullable=False)
default
устанавливает значение по умолчанию для столбца. Это значение будет автоматически присвоено столбцу, если при вставке строки значение для этого столбца не указано.from datetime import datetime
Column('created_at', DateTime, default=datetime.utcnow)
Column('last_name', String(50), index=True)
Integer
атрибут autoincrement
устанавливает автоматическое увеличение значения столбца. Это часто используется вместе с primary_key
.Column('id', Integer, primary_key=True, autoincrement=True)
Check
позволяет определить условие, которому должны соответствовать значения столбца.from sqlalchemy import CheckConstraint
Column('age', Integer, CheckConstraint('age>=0'))
Определение таблиц и столбцов - это основа работы с базами данных в SQLAlchemy Core. Освоив эти концепции, вы получите мощный инструмент для создания, изменения и взаимодействия со схемами баз данных.
В следующих статьях мы рассмотрим, как выполнять запросы с использованием SQLAlchemy Core, а также более продвинутые темы, такие как индексы, связи и транзакции.
Содержание: