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

данных SQL и мир структур данных Python.

Запишите в таблицу данные с помощью новых функций языка выражений:

... conn.execute(zoo.insert(('bear', 2, 1000.0)))

<sqlalchemy.engine.result.ResultProxy object at 0x1017ea910>

>>> conn.execute(zoo.insert(('weasel', 1, 2000.0)))

<sqlalchemy.engine.result.ResultProxy object at 0x1017eab10>

>>> conn.execute(zoo.insert(('duck', 10, 0)))

<sqlalchemy.engine.result.ResultProxy object at 0x1017eac50>

Далее создадим оператор SELECT (zoo.select() делает выборку всего, что содер-

жится в таблице, представленной объектом zoo, как это сделала бы инструкция

SELECT * FROM zoo в простом SQL):

>>> result = conn.execute(zoo.select())

Наконец, получим результат:

>>> rows = result.fetchall()

>>> print(rows)

[('bear', 2, 1000.0), ('weasel', 1, 2000.0), ('duck', 10, 0.0)]

The Object-Relational Mapper

В предыдущем разделе объект zoo являлся промежуточным звеном между SQL

и Python. В самом верхнем слое SQLAlchemy объектно-реляционное отображение

(Object-Relational Mapper, ORM) использует язык выражений SQL, но старается

сделать реальные механизмы базы данных невидимыми. Вы определяете классы,

а ORM обрабатывает способ, с помощью которого они получают данные из базы

данных и возвращают их обратно. Основная идея, на которой базируется сложный

термин «объектно-реляционное отображение», заключается в том, что вы можете

ссылаться на объекты в своем коде и поэтому придерживаться принципов работы

с Python, но при этом использовать реляционную базу данных.

Мы определим класс Zoo и свяжем его с ORM. В этот раз укажем SQLite ис-

пользовать файл zoo.db, чтобы убедиться, что ORM работает.

242

Глава 8. Данные должны куда-то попадать

Как и в предыдущих двух разделах, следующие сниппеты являются частью

одной программы, разбитой на фрагменты, которые я объясню. Не переживай-

те, если чего-то не поймете. В документации к SQLAlchemy содержатся все не-

обходимые детали, работа с SQLALchemy может оказаться довольно сложной.

Я хочу показать вам, что нужно сделать, чтобы ORM работал, чтобы вы могли

определить, какой из подходов, рассмотренных в этой главе, годится для вас боль-

ше других.

Импорт остается неизменным, но в этот раз нам нужно кое-что еще:

>>> import sqlalchemy as sa

>>> from sqlalchemy.ext.declarative import declarative_base

Вот так создается соединение:

>>> conn = sa.create_engine('sqlite:///zoo.db')

Теперь мы начинаем работать с SQLAlchemy ORM. Определяем класс Zoo и свя-

зываем его атрибуты с графами таблицы:

>>> Base = declarative_base()

>>> class Zoo(Base):

... __tablename__ = 'zoo'

... critter = sa.Column('critter', sa.String, primary_key=True)

... count = sa.Column('count', sa.Integer)

... damages = sa.Column('damages', sa.Float)