Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 185

240

Глава 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 представляет собой некий волшебный объект, который соединяет мир баз