Установка SQLAlchemy и подключение к базе данных
SQLAlchemy можно использовать с Python 2.7 и более поздними версиями. В этом руководстве будет использоваться Python 3.8, но вы можете выбрать любую версию Python 3.6+.
Установка SQLAlchemy
Для установки SQLAlchemy введите следующее:
Чтобы проверить успешность установки введите следующее в командной строке:
>>> import sqlalchemy >>> sqlalchemy.__version__ '1.4.8'Установка DBAPI
По умолчанию SQLAlchemy работает только с базой данных SQLite без дополнительных драйверов. Для работы с другими базами данных необходимо установить DBAPI-совместимый драйвер в соответствии с базой данных.
Что такое DBAPI?
DBAPI — это стандарт, который поощряет один и тот же API для работы с большим количеством баз данных. В следующей таблице перечислены все DBAPI-совместимые драйверы:
База данных | DBAPI драйвер |
---|---|
MySQL | PyMySQL, MySQL-Connector, CyMySQL, MySQL-Python (по умолчанию) |
PostgreSQL | psycopg2 (по умолчанию), pg8000, |
Microsoft SQL Server | PyODBC (по умолчанию), pymssql |
Oracle | cx-Oracle (по умолчанию) |
Firebird | fdb (по умолчанию), kinterbasdb |
Все примеры в этом руководстве протестированы в PostgreSQL, но вы можете выбрать базу данных по вкусу. Для установки DBAPI psycopg2 для PostgreSQL введите следующую команду:
Подготовка к подключению
Первый шаг для подключения к базе данных — создания объекта Engine . Именно он отвечает за взаимодействие с базой данных. Состоит из двух элементов: диалекта и пула соединений.
Диалект SQLAlchemy
SQL — это стандартный язык для работы с базами данных. Однако и он отличается от базы к базе. Производители баз данных редко придерживаются одной и той же версии и предпочитают добавлять свои особенности. Например, если вы используете Firebird , то для получения id и name для первых 5 строк из таблицы employees нужна следующая команда:
select first 10 id, name from employees
А вот как получить тот же результат для MySQL:
select id, name from employees limit 10
Чтобы обрабатывать эти различия нужен диалект. Диалект определяет поведение базы данных. Другими словами он отвечает за обработку SQL-инструкций, выполнение, обработку результатов и так далее. После установки соответствующего драйвера диалект обрабатывает все отличия, что позволяет сосредоточиться на создании самого приложения.
Пул соединений SQLAlchemy
Пул соединений — это стандартный способ кэширования соединений в памяти, что позволяет использовать их повторно. Создавать соединение каждый раз при необходимости связаться с базой данных — затратно. А пул соединений обеспечивает неплохой прирост производительности.
При таком подходе приложение при необходимости обратиться к базе данных вытягивает соединение из пула. После выполнения запросов подключение освобождается и возвращается в пул. Новое создается только в том случае, если все остальные связаны.
Для создания движка (объекта Engine ) используется функция create_engine() из пакета sqlalchemy . В базовом виде она принимает только строку подключения. Последняя включает информацию об источнике данных. Обычно это приблизительно следующий формат:
dialect+driver://username:password@host:port/database
- dialect — это имя базы данных (mysql, postgresql, mssql, oracle и так далее).
- driver — используемый DBAPI. Этот параметр является необязательным. Если его не указать будет использоваться драйвер по умолчанию (если он установлен).
- username и password — данные для получения доступа к базе данных.
- host — расположение сервера базы данных.
- port — порт для подключения.
- database — название базы данных.
Вот код для создания движка некоторых популярных баз данных:
from sqlalchemy import create_engine # Подключение к серверу MySQL на localhost с помощью PyMySQL DBAPI. engine = create_engine("mysql+pymysql://root:pass@localhost/mydb") # Подключение к серверу MySQL по ip 23.92.23.113 с использованием mysql-python DBAPI. engine = create_engine("mysql+mysqldb://root:pass@23.92.23.113/mydb") # Подключение к серверу PostgreSQL на localhost с помощью psycopg2 DBAPI engine = create_engine("postgresql+psycopg2://root:pass@localhost/mydb") # Подключение к серверу Oracle на локальном хосте с помощью cx-Oracle DBAPI. engine = create_engine("oracle+cx_oracle://root:pass@localhost/mydb")) # Подключение к MSSQL серверу на localhost с помощью PyODBC DBAPI. engine = create_engine("oracle+pyodbc://root:pass@localhost/mydb")Формат строки подключения для базы данных SQLite немного отличается. Поскольку это файловая база данных, для нее не нужны имя пользователя, пароль, порт и хост. Вот как создать движок для базы данных SQLite:
from sqlalchemy import create_engine engine = create_engine('sqlite:///sqlite3.db') # используя относительный путь engine = create_engine('sqlite:////path/to/sqlite3.db') # абсолютный путьПодключение к базе данных
Но создание движка — это еще не подключение к базе данных. Для получения соединения нужно использовать метод connect() объекта Engine , который возвращает объект типа Connection .
from sqlalchemy import create_engine # 1111 это мой пароль для пользователя postgres engine = create_engine("postgresql+psycopg2://postgres:1111@localhost/sqlalchemy_tuts") engine.connect() print(engine)Но если запустить его, то будет следующая ошибка:
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) (Background on this error at: http://sqlalche.me/e/14/e3q8)
Проблема в том, что предпринимается попытка подключиться к несуществующей базе данных. Для создания базы данных PostgreSQL нужно выполнить следующий код:
import psycopg2 from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT # Устанавливаем соединение с postgres connection = psycopg2.connect(user="postgres", password="1111") connection.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) # Создаем курсор для выполнения операций с базой данных cursor = connection.cursor() sql_create_database = # Создаем базу данных cursor.execute('create database sqlalchemy_tuts') # Закрываем соединение cursor.close() connection.close()Запустите скрипт еще раз, чтобы получить нужный вывод:
Engine(postgresql+psycopg2://postgres:***@localhost/sqlalchemy_tuts)
Дополнительные аргументы
В следующей таблице перечислены дополнительные аргументы-ключевые слова, которые можно передать в функцию create_engine() .
Аргумент | Описание |
echo | Булево значение. Если задать True, то движок будет сохранять логи SQL в стандартный вывод. По умолчанию значение равно False |
pool_size | Определяет количество соединений для пула. По умолчанию — 5 |
max_overflow | Определяет количество соединений вне значения pool_size . По умолчанию — 10 |
encoding | Определяет кодировку SQLAlchemy. По умолчанию — UTF-8. Однако этот параметр не влияет на кодировку всей базы данных |
isolation_level | Уровень изоляции. Эта настройка контролирует степень изоляции одной транзакции. Разные базы данных поддерживают разные уровни. Для этого лучше ознакомиться с документацией конкретной базы данных |
Вот скрипт, в котором использованы дополнительные аргументы-ключевые слова при создании движка: