Sqlalchemy.create engine: примеры (PYTHON)

Создание движка базы данных с помощью SQLAlchemy
Раздел: ORM, Базы данных
sqlalchemy.create_engine(url: str, **kwargs): sqlalchemy.engine.Engine

Описание функции sqlalchemy.create_engine

Функция create_engine() является основной точкой входа для работы с библиотекой SQLAlchemy. Она предназначена для создания объекта "движка" (Engine), который представляет собой центральный источник подключений к базе данных. Этот объект скрывает детали подключения и предоставляет пул соединений для эффективной работы.

Использование функции актуально в начале работы с ORM или Core SQLAlchemy для установки соединения с реляционными СУБД, такими как PostgreSQL, MySQL, SQLite, Oracle и другими.

Аргументы функции

  • url (строка или объект URL) – обязательный аргумент. Строка подключения в формате dialect+driver://username:password@host:port/database.
  • connect_args (словарь) – дополнительные аргументы, которые передаются непосредственно драйверу базы данных при установке соединения.
  • echo (булево значение) – если установлено в True, движок будет логировать все SQL-запросы.
  • poolclass – класс пула соединений для использования (например, StaticPool, QueuePool).
  • pool_size (целое число) – количество соединений для хранения в пуле.
  • max_overflow (целое число) – максимальное количество соединений сверх pool_size, которые могут быть созданы.
  • pool_recycle (целое число) – время в секундах, после которого соединение переподключается автоматически.
  • future (булево значение) – использование стиля API версии 2.0. В SQLAlchemy 2.0 этот аргумент стал устаревшим.

Возвращаемое значение

Функция возвращает объект sqlalchemy.engine.Engine. Этот объект не является самим соединением, а фабрикой для их создания. Для получения подключения используется метод Engine.connect() или работа через сессии ORM.

Примеры использования create_engine

Подключение к SQLite базе данных в памяти:

from sqlalchemy import create_engine
engine = create_engine('sqlite:///:memory:', echo=True)
# Логирование SQL будет выводиться в консоль при выполнении запросов.

Подключение к PostgreSQL с использованием psycopg2:

engine = create_engine('postgresql+psycopg2://user:pass@localhost/mydb',
                       pool_size=20,
                       max_overflow=0)
# Создан движок с пулом из 20 фиксированных соединений.

Подключение к MySQL с дополнительными аргументами:

engine = create_engine('mysql+pymysql://user:pass@localhost/test',
                       connect_args={'charset': 'utf8mb4'},
                       pool_recycle=3600)
# Установлена кодировка соединения и время переподключения 1 час.

Похожие функции и подходы в Python

Для работы с базами данных в Python существуют другие библиотеки и встроенные модули.

  • sqlite3.connect() (встроенный модуль) – прямое подключение к SQLite. Используется для простых проектов только с этой СУБД без абстракции ORM.
  • psycopg2.connect() – низкоуровневое подключение к PostgreSQL. Применяется когда не требуется функционал ORM или нужен прямой контроль.
  • database.connect() из библиотек типа asyncpg или aiomysql – асинхронные драйверы. Предпочтительны в асинхронных приложениях (FastAPI, aiohttp). SQLAlchemy также предлагает асинхронный движок через create_async_engine.
  • Встроенные инструменты фреймворков (например, Django ORM). Используются в проектах, построенных на этих фреймворках, для обеспечения интеграции.

Функция create_engine является универсальным решением для SQLAlchemy, объединяющим пуллинг, диалекты и интеграцию с ORM.

Аналоги функции в других языках программирования

В других экосистемах существуют похожие концепции для подключения к базе данных.

JavaScript (Node.js с библиотекой mysql2):

const mysql = require('mysql2/promise');
const pool = mysql.createPool({
  host: 'localhost',
  user: 'root',
  database: 'test',
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0
});
// Создан пул соединений с ограничением в 10 подключений.

Java (JDBC с HikariCP):

HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:postgresql://localhost/test");
config.setUsername("user");
config.setPassword("pass");
config.setMaximumPoolSize(20);
HikariDataSource ds = new HikariDataSource(config);
// Создан источник данных с пулом соединений HikariCP.

PHP (PDO):

$dsn = 'mysql:host=localhost;dbname=test;charset=utf8mb4';
$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
$pdo = new PDO($dsn, 'user', 'pass', $options);
// Создан объект PDO, представляющий подключение к базе данных.

Основное отличие SQLAlchemy – глубокая интеграция с ORM и система выражений Core, в то время как аналоги часто предоставляют только клиент для выполнения запросов.

Распространенные ошибки и их решение

Ошибка из-за некорректного URL или отсутствия драйвера:

engine = create_engine('postgresql://user:pass@localhost/mydb')
# При отсутствии psycopg2
ModuleNotFoundError: No module named 'psycopg2'

Решение: установить драйвер pip install psycopg2-binary или использовать другой.

Ошибка аутентификации или недоступности сервера:

engine = create_engine('mysql://wrong:pass@localhost/db')
connection = engine.connect()  # Попытка подключения
OperationalError: (pymysql.err.OperationalError) (1045, "Access denied for user 'wrong'@'localhost' (using password: YES)")

Решение: проверить учетные данные, хост и порт.

Использование устаревшего формата URL для SQLAlchemy 2.0+:

# В старом стиле (1.x) использование 'future' аргумента
engine = create_engine("postgresql://...", future=True)  # Устарело в 2.0

В версии 2.0 API по умолчанию использует новый стиль, а аргумент future не требуется.

Изменения в последних версиях SQLAlchemy

В SQLAlchemy 2.0 произошли значительные изменения в API, затронувшие и create_engine.

  • Аргумент future был удален. Новый стиль API 2.0 используется по умолчанию.
  • Упрощена и унифицирована система типизации результатов запросов.
  • Рекомендуется использовать новый стиль работы с сессиями через sessionmaker.
  • Появилась явная поддержка асинхронного API через функцию create_async_engine, возвращающую AsyncEngine.

Для миграции с версии 1.4 на 2.0 обычно требуется обновить код в соответствии с рекомендациями, но большинство аргументов create_engine остались обратно совместимыми.

Расширенные примеры использования

Создание движка с пользовательским пулом соединений для тестов (StaticPool):

Пример python
from sqlalchemy.pool import StaticPool
engine = create_engine('sqlite://',
                       connect_args={'check_same_thread': False},
                       poolclass=StaticPool,
                       echo=True)
# Создано однопоточное соединение, часто используется в тестах.

Интеграция с протоколом PostgreSQL для автоматического определения схемы:

Пример python
from sqlalchemy import event

def on_connect(dbapi_connection, connection_record):
    cursor = dbapi_connection.cursor()
    cursor.execute("SET search_path TO myschema, public")

engine = create_engine('postgresql+psycopg2://...')
event.listen(engine, 'connect', on_connect)
# При каждом новом соединении будет устанавливаться путь к схеме.

Использование асинхронного движка в SQLAlchemy 2.0:

Пример python
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker

async_engine = create_async_engine(
    "postgresql+asyncpg://user:pass@localhost/dbname",
    echo=True,
    pool_size=10,
    max_overflow=20
)
AsyncSessionLocal = sessionmaker(async_engine, class_=AsyncSession, expire_on_commit=False)
# Создан асинхронный движок и фабрика сессий для использования с async/await.

Подключение к Microsoft SQL Server с использованием pyodbc и параметров драйвера:

Пример python
params = urllib.parse.quote_plus(
    "DRIVER={ODBC Driver 17 for SQL Server};"
    "SERVER=localhost;"
    "DATABASE=testdb;"
    "UID=user;"
    "PWD=pass"
)
engine = create_engine(f"mssql+pyodbc:///?odbc_connect={params}")
# Установлено подключение через ODBC с заданными параметрами строки.

питон sqlalchemy.create_engine function comments

En
Sqlalchemy.create engine Create a SQLAlchemy engine instance