Запишите в таблицу данные с помощью новых функций языка выражений:
... 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)