Диалект | Драйвер |
---|---|
sqlite | pysqlite (можно опустить) |
mysql | mysqlconnector |
mysql | pymysql |
mysql | oursql |
postgresql | psycopg2 |
postgresql | pypostgresql |
Сначала мы попробуем поработать с самым низким уровнем SQLAlchemy, возможности которого почти не отличаются от функций DB-API.
Попробуем поработать с SQLite, поскольку его поддержка уже встроена в Python. Строка соединения для SQLite опускает значения параметров host, port, user и password. dbname информирует SQLite о том, какой файл использовать для хранения вашей базы данных. Если вы опустите параметр dbname, SQLite создаст базу данных в памяти. Если значение параметра dbname начинается со слеша (/), оно является абсолютным именем файла на вашем компьютере (как в Linux и OS X). В противном случае оно является относительным именем текущего каталога.
Следующие сегменты являются частью одной программы, разделенной на части для удобства объяснения.
Для начала нужно импортировать все, что нам понадобится. Следующая строка является примером
>>> import sqlalchemy as sa
Соединимся с базой данных и создадим хранилище в памяти (строка аргументов 'sqlite:///:memory: ' также сработает):
>>> conn = sa.create_engine('sqlite://')
Создадим таблицу, которая называется zoo и содержит три графы:
>>> conn.execute('''CREATE TABLE zoo
…·····(critter VARCHAR(20) PRIMARY KEY,
…······count INT,
…······damages FLOAT)''')
Вызов conn.execute() возвращает объект SQLAlchemy, который называется ResultProxy. Скоро вы увидите, что с ним можно сделать.
Кстати, если вы раньше никогда не создавали базы данных, примите мои поздравления. Можете вычеркнуть этот пункт из своего списка дел, которые обязательно нужно реализовать в жизни.
Далее вставьте три набора данных в новую пустую таблицу:
>>> ins = 'INSERT INTO zoo (critter, count, damages) VALUES (???)'
>>> conn.execute(ins, 'duck', 10, 0.0)
>>> conn.execute(ins, 'bear', 2, 1000.0)
>>> conn.execute(ins, 'weasel', 1, 2000.0)
Далее сделайте выборку того, что только что разместили в базе:
>>> rows = conn.execute('SELECT * FROM zoo')
В SQLAlchemy rows не является списком — это специальный объект ResultProxy, который мы не можем отобразить непосредственно:
>>> print(rows)
Однако вы можете итерировать по нему, как по списку, и получать по одному ряду за раз:
>>> for row in rows:
…·····print(row)
…
('duck', 10, 0.0)
('bear', 2, 1000.0)
('weasel', 1, 2000.0)
Этот пример очень похож на другой, где использовался SQLite DB-API. Единственное преимущество этого подхода заключается в том, что нам не нужно импортировать драйвер — SQLAlchemy сам определил драйвер на основе строки соединения. Простое изменение строки соединения позволит перенести этот код на базу данных другого типа. Еще один плюс SQLAlchemy заключается в наличии
Следующий уровень SQLAlchemy — это язык выражений SQL. Он предоставляет функции, которые позволяют создать SQL для разных операций. Язык выражений обрабатывает большее количество различий в диалектах, чем низкоуровневый слой движка. Он может оказаться полезным промежуточным решением для приложений, работающих с реляционными базами данных.
Рассмотрим создание и наполнение таблицы zoo. Вновь все последующие фрагменты принадлежат одной программе.
Импортирование и подключение не изменяются:
>>> import sqlalchemy as sa
>>> conn = sa.create_engine('sqlite://')
Для того чтобы определить таблицу zoo, вместо SQL начнем использовать язык выражений:
>>> meta = sa.MetaData()
>>> zoo = sa.Table('zoo', meta,
…·····sa.Column('critter', sa.String, primary_key=True),
…·····sa.Column('count', sa.Integer),
…·····sa.Column('damages', sa.Float)
…····)
>>> meta.create_all(conn)