Приложение на языке Python может использовать различные базы данных - SQLite, PostgreSQL и т.д. Но при работе с каждой конкретной системой базой данных мы вынуждены писать запросы на языке SQL, соответственно возникает необходимость владения данным языком. Кроме того, если мы захотим легко и быстро перейти с одной СУБД к другой, то, возможно, нам потребуется внести немало изменений в настройку подключения, синтаксис запросов, поскольку диалекты SQL в разных СУБД могут отличаться. Чтобы решить эти проблемы, применяются специальные ORM-библиотеки (Object Relational Mapper), которые позволяют абстрагироваться от строения конкретной базы данных и позволяют работать с данными как с объектами стандартных классов Python. Для языка Python одной из наиболее популярных ORM-библиотек является SQLAlchemy (официальный сайт https://www.sqlalchemy.org/).
Официально поддерживаются все наиболее популярные системы баз данных: PostgreSQL, MySQL, MariaDB, SQLite, Oracle и Microsoft SQL Server. Кроме того, есть сторонние пакеты для SQLAlchemy, которые добавляют поддержку для менее распространенных систем, типа CockroachDB, Firebird, IBM DB2 и т.д.
При работе с SQLAlchemy следует учитывать версию Python: SQLAlchemy 2.0 поддерживает Python 3.7 и выше.
Для работы с SQLAlchemy прежде всего установим соответствующий пакет через менеджер pip:
pip install SQLAlchemy
Для начала взаимодействия с базой данных необходимо создать движок - объект класса Engine. Обычно он представляет глобальный объект, который создается в приложении один раз для всех взаимодействий с определенным сервером баз данных и который хранит все подключения в виде пула к этому серверу баз данных. Для создания движка применяется функция create_engine():
create_engine(url, **kwargs)
В качестве обязательного параметра в функцию create_engine()
передается адрес URL подключения в формате
dialect[+driver]://user:password@host/dbname[?key=value..]
Строка подключения складывается из следующих частей:
dialect представляет название системы бд, например, mysql, oracle, postgresql, sqlite
.
driver указывает на драйвер (DBAPI), применяемый для подключения к бд, например, psycopg2, pyodbc, cx_oracle и т.д. Для одной и той же СУБД может быть доступно множество драйверов. Если драйвер явным образом не указывается, то применяется драйвер по умолчанию.
user:password: имя и пароль пользователя для подключения к бд
host: адрес сервера базы данных
dbname: имя базы данных
key=value: пары ключ-значения, которые представляют дополнительные параметры для подключения
Например, определим движок для подключения к базе данных sqlite, которая называется metanit.db:
from sqlalchemy import create_engine engine = create_engine("sqlite:///metanit.db")
В данном случае указаны только опции dialect
и dbname
.
Для настройки движка функция create_engine()
также может принимать вспомогательные параметры. Их довольно, отметим наиболее распространенный - параметр echo
:
from sqlalchemy import create_engine engine = create_engine("sqlite:///metanit.db", echo=True)
При echo=True
все операции с бд будут логгироваться на консоль
PostgreSQL
engine = create_engine("postgresql://user:password@localhost/database")
MySQL
engine = create_engine("mysql://user:password@localhost/database")
Oracle
engine = create_engine("oracle://user:password@127.0.0.1:1521/database")
Microsoft SQL Server
engine = create_engine("mssql://user:password@database")
SQLite:
engine = create_engine("sqlite:///относительный_путь/database") engine = create_engine("sqlite:////абсолютный_путь/database")
Одной из прелестей работы с SQLAlchemy состоит в том, что, чтобы перейти от одной СУБД к другой, в большинстве случаев достаточно изменить строку подключения к базе данных.