Импортирование и подключение не изменяются:
>>>> import sqlalchemy as sa
>>>> conn = sa.create_engine('sqlite://')
Для того чтобы определить таблицу zoo, вместо SQL начнем использовать язык выражений:
>>>> meta = sa.MetaData()
>>>> zoo = sa.Table('zoo', meta,
>…·····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 представляет собой некий волшебный объект, который соединяет мир баз данных SQL и мир структур данных Python.
Запишите в таблицу данные с помощью новых функций языка выражений:
>… conn.execute(zoo.insert(('bear', 2, 1000.0)))
>
>>>> conn.execute(zoo.insert(('weasel', 1, 2000.0)))
>
>>>> conn.execute(zoo.insert(('duck', 10, 0)))
>
Далее создадим оператор 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 работает.
Как и в предыдущих двух разделах, следующие сниппеты являются частью одной программы, разбитой на фрагменты, которые я объясню. Не переживайте, если чего-то не поймете. В документации к SQLAlchemy содержатся все необходимые детали, работа с SQLALchemy может оказаться довольно сложной. Я хочу показать вам, что нужно сделать, чтобы ORM работал, чтобы вы могли определить, какой из подходов, рассмотренных в этой главе, годится для вас больше других.