Глава 8. Данные должны куда-то попадать
Далее сделайте выборку того, что только что разместили в базе:
>>> rows = conn.execute('SELECT * FROM zoo')
В SQLAlchemy rows не является списком — это специальный объект ResultProxy,
который мы не можем отобразить непосредственно:
>>> print(rows)
<sqlalchemy.engine.result.ResultProxy object at 0x1017ef9d0>
Однако вы можете итерировать по нему, как по списку, и получать по одному
ряду за раз:
>>> 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. Вновь все последующие фраг-
менты принадлежат одной программе.
Импортирование и подключение не изменяются:
>>> import sqlalchemy as sa
>>> conn = sa.create_engine('sqlite://')
Для того чтобы определить таблицу zoo, вместо SQL начнем использовать язык
выражений:
>>> meta = sa.MetaData()
>>> zoo = sa.Table('zoo', meta,
Реляционные базы данных
241
... sa.Column('critter', sa.String, primary_key=True),
... sa.Column('count', sa.Integer),
... sa.Column('damages', sa.Float)
... )
>>> meta.create_all(conn)
Обратите внимание на круглые скобки в операции, которая занимает несколь-
ко строк в предыдущем примере. Структура метода Table() совпадает со структурой
таблицы. Поскольку наша таблица содержит три графы, в методе Table() располо-
жены три вызова метода Column().
zoo представляет собой некий волшебный объект, который соединяет мир баз