Начало любого приложения с использованием SQLAlchemy начинается с объекта, называемого машиной соединений (англ. Engine). Этот объект представляет собой центральный компонент, осуществлящий соединения к отдельным базам данных, предоставляя также фабрику соединений (или пул соединений, англ. connection pool) для работы с ними. Машина является фактически глобальным объектом, создаваемым единожды с заданными настройками для подключения к базе данных, которые чаще всего представляют собой строчку URL.

Для данного туториала мы будем использовать SQLite базу данных, так как это простой способ показать и протестировать простые вещи, без необходимости поднятия полноценного сервера. Машина соединения создается при помощи функции create_engine(), при этом если передать в качестве ее параметра future=True, то мы получим полный доступ к использованию нового стиля SQLAlchemy 2.0:

from sqlalchemy import create_engine
engine = create_engine("sqlite+pysqlite:///:memory:", echo=True, future=True)

Главный аргумент для функции create_engine это строчка URL, выше мы передали строчку для подключения к SQLite базе данных прямо в оперативной памяти нашего компьютера (то есть даже без создания файла бд). Эта строчка передает три важных факта:

  1. С каким типом СУБД мы будем иметь дело? В данном случае это sqlite, который передает SQLAlchemy информацию о том, что необходимо использовать соответствующий диалект.
  2. Какой DBAPI мы будем использовать? Python DBAPI это сторонний драйвер, который позволяет алхимии взаимодействовать с отдельными базами данных. В данном случае мы используем pysqlite, который в Python3 заменен на sqlite3, входящим в стандартную библиотеку. Если это не будет указано, то SQLAlchemy сам решит какой DBAPI использовать.
  3. И в конце концов, где мы собираемся эту базу данных распологать. В данном случае URL включает фразу /:memory:, которая говорит sqlite3, что мы будем работать с in-memory-only базой данных.

<aside> ⚠️ Машина соединений, которая возвращается при исполнении функции create_engine(), на самом деле не пытается сразу же подключиться к базе данных по переданному URL, и сделает это лишь при первом обращении к базе данных. Такой паттерн поведения называют ленивой инициализацией (англ. lazy initialization).

</aside>

Обратите внимание, что мы также передали параметр echo=True, который приказывает нашей машине сообщать о всех SQL запросах в логер Python, который в свою очередь будет передавать их в системный вывод (условно консоль). По большому счету, данный параметр всего лишь более простой путь настроить логирование и это может быть очень полезно в некоторых ситуациях.