SQLAlchemy: различия между версиями

Содержимое удалено Содержимое добавлено
викификация
Строка 24:
 
== Объектно-реляционная модель SQLAlchemy ==
'''Соединение с базой данных'''
 
'''===== Соединение с базой данных''' =====
В этом уроке мы будем использовать только БД ''SQLite'', хранящуюся в памяти.
Чтобы соединиться с СУБД, мы используем функцию ''create_engine()'':
Строка 33:
Когда он включен, мы увидим все созданные нами SQL-запросы. Если вы хотите просто пробежать этот урок и убрать отладочный вывод, то просто уберите его, поставив <source lang=python>echo=False</source>
 
'''===== Создание таблицы в базе данных''' =====
 
Далее мы пожелаем рассказать SQLAlchemy о наших таблицах. Мы начнем с одиночной таблицы ''users'', В которой будем хранить записи о наших конечных пользователях, которые посещают некий сайт N. Мы определим нашу таблицу внутри каталога ''MetaData'', используя конструктор ''Table()'', который похож на SQLный ''CREATE TABLE:''
 
Строка 55 ⟶ 54 :
Поле «длина» в строках String, как и простая разрядность/точность в ''Integer'', ''Numeric'' и т. п. не используются более нигде, кроме как при создании таблиц.
 
'''===== Определение класса Python для отображения в таблицу''' =====
 
В то время, как класс ''Table'' хранит информацию о нашей БД, он ничего не говорит о логике объектов, что используются нашим приложением. SQLAlchemy считает это отдельным вопросом. Для соответствия нашей таблице users создадим элементарный класс ''User''. Нужно только унаследоваться от базового питоньего класса ''Object'' (то есть у нас совершенно новый класс).
<source lang=python>>>> class User(object):
Строка 70 ⟶ 68 :
Они определены здесь для удобства. Они не обязательны и могут иметь любую форму. SQLAlchemy не вызывает ''__init__'' напрямую
 
'''===== Настройка отображения''' =====
Теперь мы хотим слить в едином порыве нашу таблицу user_table и класс User. Здесь нам пригодится пакет ''SQLAlchemy ORM''. Мы применим функцию ''mapper'', чтобы создать отображение между ''users_table'' и ''User''.
<source lang=python>>>> from sqlalchemy.orm import mapper
Строка 88 ⟶ 86 :
Так как мы не сказали SQLAlchemy сохранить Василия в базу, его ''id'' выставлено на ''None''. Когда позже мы сохраним его, в этом атрибуте будет храниться некое автоматически сформированное значение.
 
'''===== Декларативное создание таблицы, класса и отображения за один раз.''' =====
 
Предыдущее приближение к конфигурированию, включающее таблицу ''Table'', пользовательский класс и вызов ''mapper()'' иллюстрируют классический пример использования SQLAlchemy, в которой очень ценится разделение задач. Большое число приложений, однако, не требуют такого разделения, и для них SQLAlchemy предоставляет альтернативный, более лаконичный стиль: декларативный.
<source lang=python>>>>from sqlalchemy.ext.declarative import declarative_base
Строка 115 ⟶ 112 :
Еще один «декларативный» метод для SQLAlchemy доступен в сторонней библиотеке ''Elixir''. Это полнофункциональный продукт, который включает много встроенных конфигураций высокоуровневого отображения. Как и деклaративы, как только классы и отображения определены, использование ORM будет таким же, как и в классическом SQLAlchemy.
 
'''===== Создание сессии''' =====
 
Теперь мы готовы начать наше общение с базой данных. «Ручка» базы в нашем случае — это сессия ''Session''. Когда сначала мы запускаем приложение, на том же уровне нашего ''create_engine()'' мы определяем класс ''Session'', что служит фабрикой объектов ''сессий'' (''Session'').
<source lang=python>>>> from sqlalchemy.orm import sessionmaker
Строка 128 ⟶ 124 :
Сессия здесь ассоциирована с SQLite, но у нее еще нет открытых соединений с этой базой. При первом использовании она получает соединение из набора соединений, который поддерживается engine и удерживает его до тех пор, пока мы не применим все изменения и/или не закроем объект сессии.
 
'''===== Добавление новых объектов''' =====
 
Чтобы сохранить наш User-объект, нужно добавить его к нашей сессии, вызвав ''add()'':
<source lang=python>>>> vasiaUser = User("vasia", "Vasiliy Pypkin", "vasia2000")
Строка 160 ⟶ 155 :
После того, как сессия вставит новые записи в базу, все только что созданные идентификаторы … будут доступны в объекте, немедленно или по первому требованию. В нашем случае, целая запись была перезагружена при доступе, так как после вызова ''commit()'' началась новая транзакция. SQLAlchemy стандартно обновляет данные от предыдущей транзакции при первом обращении с новой транзакцией, так что нам доступно самое последнее ее состояние. Уровень подгрузки настраивается, как описано в главе ''«Сессии»''.
 
'''===== Откат изменений''' =====
 
Учитывая то, что сессия работает с транзакциями, мы можем откатить сделанные изменения. Давайте внесем два изменения, которые затем мы откатим; поменяем имя пользователя vasiaUser на Vaska:
<source lang=python>>>> vasiaUser.name = 'Vaska'</source>
Строка 181 ⟶ 175 :
[<User('vasia','Vasiliy Pupkin', '-=VP2001=-')>]</source>
 
'''===== Запросы''' =====
 
Запрос создается посредством использования функции ''query()'' для сессии. Эта функция берет переменное число аргументов, которыми может быть любая комбинация классов и дескрипторов, созданных с помощью классов. Ниже, мы демонстрируем запрос, который загружает экземпляры User. В итеративном цикле возвращается список объектов User:
<source lang=python>>>> for instance in session.query(User).order_by(User.id):
Строка 228 ⟶ 221 :
 
== См. также ==
* [[SQLAlchemy/Sessions|SQLAlchemy/Sessions]]
 
* [[SQLAlchemy/Sessions|SQLAlchemy/Sessions]]
 
{{BookCat}}