>>>> 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 заключается в наличии пула соединений, о котором вы можете прочитать на сайте http://bit.ly/conn-pooling, содержащем документацию.
Язык выражений SQL
Следующий уровень SQLAlchemy — это язык выражений SQL. Он предоставляет функции, которые позволяют создать SQL для разных операций. Язык выражений обрабатывает большее количество различий в диалектах, чем низкоуровневый слой движка. Он может оказаться полезным промежуточным решением для приложений, работающих с реляционными базами данных.
Рассмотрим создание и наполнение таблицы zoo. Вновь все последующие фрагменты принадлежат одной программе.