В этой главе мы познакомились с объектно-ориентированными базами данных, которые позволяют хранить объекты Python, а также с базами данных SQL, хранящими данные в таблицах. Как оказывается, существует еще один класс систем, которые служат мостом между мирами объектов и таблиц, и которые я упоминал ранее в этой главе: механизмы ORM позволяют подружить модель классов Python с таблицами в реляционных базах данных. Они объединяют мощь систем реляционных баз данных с простотой объектно-ориентированного синтаксиса Python; они позволяют использовать базы данных SQL и сохранять в них данные, которые в сценариях выглядят как объекты Python.
В настоящее время среди открытых систем сторонних разработчиков имеются два лидера, реализующих такое отображение: SQLObject и SQL- Alchemy. Обе являются слишком сложными системами, чтобы их можно было достаточно полно рассмотреть в этой книге, поэтому ищите соответствующую документацию в Интернете для получения более полного представления о них (в настоящее время имеются даже книги, специально посвященные SQLAlchemy). Кроме того, к моменту написания этих слов ни одна из них еще не была полностью готова для использования в Python 3.X, поэтому я не могу в этой книге привести примеры работы с ними.
Однако, чтобы дать вам некоторое представление о модели ORM, ниже кратко рассказывается о том, как можно использовать систему SQLOb- ject для создания и обработки записей в базе данных. В двух словах, SQLObject отображает:
• Классы Python в таблицы базы данных.
• Экземпляры классов Python в записи внутри таблиц.
• Атрибуты экземпляров в столбцы записей.
Например, чтобы создать таблицу, необходимо определить класс, атрибуты которого будут определять столбцы, и вызвать метод создания (следующий фрагмент взят из более полного примера, который приводится на веб-сайте SQLObject):
from sqlobject import *
sqlhub.processConnection = connectionForURI(‘sqlite:/:memory:’)
class Person(SQLObject): # класс: описывает таблицу
first = StringCol() # атрибуты класса: описывают столбцы
mid = StringCol(length=1, default=None) last = StringCol()
Person.createTable() # создать таблицу в базе данных
После создания экземпляра в базу данных автоматически добавляется новая запись, а операции обращения к атрибутам автоматически отображаются в операции с соответствующими столбцами записи в таблице:
p = Person(first=’Bob’, last=’Smith’) # новый экземпляр: создает
# новую запись
p # выведет все атрибуты по именам
p.first # атрибуты: извлечет значение столбца
p.mid = ‘M‘ # атрибуты: обновит запись
Существующие записи/экземпляры могут извлекаться вызовом методов, и имеется возможность присваивать значения сразу нескольким столбцам/атрибутам в одной операции:
p2 = Person.get(1) # извлечь существующую запись/экземпляр: p2 это p
p.set(first=’Tom‘, last=’Jones‘) # изменить 2 атрибута/поля в одной операции
Кроме того, имеется возможность выбирать записи по значениям столбцов, создав объект запроса и выполнив его:
ts = Person.select(Person.q.first==’Tom’) # запрос: выборка
# по значению столб.
list(ts) # выполнить запрос: список экземпл.
tjs = Person.selectBy(first=’Tom’, last=’Jones’) # альтернативная форма
# запроса (по И)
Естественно, в этих примерах мы коснулись лишь малой части имеющихся функциональных возможностей. Однако даже на этом уровне сложности невозможно не заметить главную хитрость — механизм SQL- Object автоматически выполняет все запросы SQL, необходимые для извлечения, сохранения и запроса таблиц и записей, подразумеваемых реализацией классов Python здесь. Все это позволяет использовать мощь промышленных реляционных баз данных, используя при этом знакомый синтаксис классов Python для обработки хранимых данных в сценариях Python.
Порядок использования ORM SQLAlchemy, конечно же, существенно отличается, но его функциональные возможности и получаемый конечный результат аналогичны. За дополнительной информацией о механизмах ORM для Python обращайтесь через свои поисковые системы к Интернету. Вы можете также поближе познакомиться с такими системами и их задачами в некоторых крупных веб-фреймворках. Например, в состав Django входит механизм ORM, являющийся вариацией на эту тему.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011