Skip to content

doc_02_abstract

grossho edited this page Aug 8, 2011 · 16 revisions

Концепция ORM.

Введение.

Наименование этого модуля (billow) взято по нескольким соображениям. В основном это касается переводного смысла — «волна», а другой — фонетическое произношение близко к произношению «be low» — «быть низким». Здесь предлагается интерпретировать в отношении уровня исполнения. То есть модуль должен быть низкоуровневой платформой для построения кода.

Предпосылкой для создания этого проекта явилась тенденция усложнения других ORM систем. В их развитии прослеживается стремиться покрыть функционал как можно большего количества поставщиков SQL СУБД, одновременно вместе с этим уделяя много внимания строгой типизации, для безопасной подстановки в тело SQL надлежащим образом экранированных данных. К каждой СУБД обычно поставляется одна поведенческая реализация.

В многих смыслах цель данного проекта мало отличается от подобных. Основное отличие кратко можно обозначить, как «плагин-ориентированная ORM». Другими словами, модуль призван обеспечить схождение большей части возможности реляционных и NoSQL в единый набор Python операций. Плагин, обеспечивающий преобразование аргументов в набор команд и данных (что в последующем тексте будем выражать под термином «диалект СУБД»), обеспечивает также и путь преобразования, что позволяет для одного диалекта реализовать несколько разновидностей рабочих модулей.

Концепция плагин-ориентированной архитектуры ORM влечет за собой необходимость обеспечить охват в базовый набор как можно большего количества операций и стратегий работы с данными. При этом набор операндов, типов и функций должен оставаться ограничен, и расширяться исходя из разумного минимализма — когда иной способ приводит к построению запутанной логики, при этом не имея возможности быть упрощенным.

Построенная программа на основе примитивов этого модуля будет обладать несколькими свойствами:

  • переносимость кода между разными поставщиками СУБД;
  • безопасная работа в много поточном окружении даже в случае частично подготовленных для этого backend-модулей;
  • возможность быстрого переключения части расчетов СУБД на плечи ORM обработчика;
  • инструментарий по преобразованию таблиц к иерархическому представлению баз данных (графы также представимы в виде деревьев, с тем чтобы количество итераций по обходу в глубину всегда было конечным числом);
  • поддержка транзакций с выносом реализации на более высокий уровень абстракции;
  • возможность позднего связывания исполняемых данных с уровнем подключения к СУБД;
  • дополнительные функции и объекты, расширяющие изначальный набор.

Тип Nil и функции модуля billow.

К функциям и некоторым типам модуля было решено подключать суффикс — «owe», который для коротких имен однозначно бы отсылал к этому модулю. В виду предполагающейся частоты экспорта данная мера должна уменьшить пересечение по именам с другими элементами.

Перенос работы из SQL в Python и наоборот требует внести интероперабельный объект, по свойствам схожим с NULL значением в SQL определении. Сверку с ним можно осуществить только за счет «is» или «is not» операции, а любые попытки использовать его как операнд будут приводить к его же собственному значению.

Чтобы его значение можно было легко заменить на другое, используется функция «coalesce» и «coalesce_it» – выбирают первое не Nil значение. Если такого нет, возвращается Nil значение – без генерации исключения. Для поиска максимального значения используются функции «maxowe» и «maxowe_it». Для поиска минимального значения используются функции «minowe» и «minowe_it». В качестве дополнительной функции используется функция «edgeowe» и «edgeowe_it» для получения одновременно максимального и минимального значений в виде двухместного кортежа. Если список пуст или состоит из одних Nil значений, то возвращается кортеж из двух Nil значений. Эта функция на сложных вычислениях экономит одну четверть сравнений (на два элемента проводится три проверки, вместо четырех).

Функции «expectone» и «expectone_it» не имеют аналогов в SQL, и неявно используется в PL/SQL. Для python функций ближайшим аналогом является метод модуля sqlalchemy - «query.one». Работает следующим образом:

  • если последовательность пустая или состоит лишь из одних Nil элементов – возвращается Nil;
  • если последовательность содержит ровно одно не Nil значение – возвращается именно оно;
  • если последовательность содержит более одного не Nil элемента – генерируется исключение «billow.ExpectOneError» с аргументом в виде списка не Nil значений, приведших к конфликту. Исключение «billow.ExpectOneError» базируется на ValueError.

Функции expectone и expectone_it полезны тогда, когда из всех значений итератора требуется только одно не Nil значение. За счет оптимизации такое вычисление производится значительно быстрее. Оптимизация нацелена на получение ровно одного значения.

Функции с суффиксом «_it» работают с итератором в качестве единственного аргумента. Без этого суффикса используют итерирование своего списка аргументов.

Перечисленные функции служит для упрощения итерирования над столбцами БД, для которых допустимо Nil значение. Важно, что именно Nil, а не None, т.к. его синоним: NULL — в контексте SQL языка представляет из себя интероперабельный объект, а объект None в Python – нет. Кроме того при вычислении максимального или минимального значений посредством функций max, min соответственно, не нужно фильтровать значения в итерациях. Здесь предлагается создать разновидность этой функции в виде maxowe и minowe. Текущая спецификация None не может быть изменена, поскольку None в контексте SQL не имеет аналогов и при любой попытке свершения операции над ним должен генерировать исключение (кроме операции проверки на тождественность и операций по добавлению в, и удалению из, составного элемента)

Clone this wiki locally