Web2py - Уровень абстракции базы данных

В Database Abstraction Layer (DAL)считается главной сильной стороной web2py. DAL предоставляет простой интерфейс прикладного программирования (API) для базового синтаксиса SQL.

В этой главе мы познакомимся с нетривиальными приложениями DAL, такими как создание запросов для эффективного поиска по тегам и построение иерархического дерева категорий.

Некоторые важные особенности DAL:

  • web2py включает уровень абстракции базы данных (DAL), API, который отображает объекты Python в объекты базы данных. Объектами базы данных могут быть запросы, таблицы и записи.

  • DAL динамически генерирует SQL в реальном времени, используя указанный диалект для серверной части базы данных, поэтому для разработчика не обязательно писать полный запрос SQL.

  • Основное преимущество использования DAL состоит в том, что приложения будут переноситься с различными типами баз данных.

Начало работы с DAL

Большинство приложений в web2py требуют подключения к базе данных. Следовательно, построение модели базы данных - это первый шаг в разработке приложения.

Рассмотрим недавно созданное приложение с именем “helloWorld”. База данных реализована в рамках Моделей приложения. Все модели для соответствующего приложения содержатся в файле с именем -models/db_custom.py.

Следующие шаги используются для реализации DAL -

Шаг 1 - Конструктор DAL

Установите соединение с базой данных. Он создается с использованием объекта DAL, который также называется конструктором DAL.

db = DAL ('sqlite://storage.sqlite')

Примечательной особенностью DAL является то, что он позволяет несколько соединений с одной и той же базой данных или с разными базами данных, даже с разными типами баз данных. Замечено, что эта строка уже есть в файлеmodels/db.py. Следовательно, он может вам не понадобиться, если вы его не удалили или вам не нужно подключаться к другой базе данных. По умолчанию web2py подключается к базе данных SQLite, хранящейся в файле.storage.sqlite.

Этот файл находится в папке с базами данных приложения. Если файл отсутствует, он создается web2py при первом запуске приложения.

SQLite работает быстро и хранит все данные в одном файле. Это означает, что ваши данные можно легко перенести из одного приложения в другое. Фактически, базы данных SQLite упаковываются web2py вместе с приложениями. Он обеспечивает полную поддержку SQL, включая переводы, объединения и агрегаты.

У SQLite есть два недостатка.

  • Во-первых, он не применяет типы столбцов, и нет ALTER TABLE, кроме добавления и удаления столбцов.

  • Другой недостаток заключается в том, что вся база данных блокируется любой транзакцией, требующей доступа для записи.

Шаг 2 - Конструктор таблиц

Как только соединение с базой данных установлено, мы можем использовать define_table метод определения новых таблиц.

Например -

db.define_table('invoice',Field('name'))

Вышеупомянутый метод также используется в конструкторе таблиц. Синтаксис конструктора таблиц такой же. Первый аргумент - это имя таблицы, за которым следует списокField(s). Конструктор поля принимает следующие аргументы -

Старший Нет Аргументы и использование
1

The field name

Имя поля в таблице.

2

The field type

принимает значения, имеющие любой из типов данных, такие как строка (по умолчанию), текст, логическое значение, целое число и так далее.

3

Length

Определяет максимальную длину.

4

default = None

Это значение по умолчанию при вставке новой записи.

5

update = None

Это работает так же, как по умолчанию, но значение используется только при обновлении, а не при вставке.

6

Notnull

Это указывает, может ли значение поля быть NULL или нет.

7

readable = True

Это указывает, доступно ли поле для чтения в формах или нет.

8

writable = True

Это определяет, доступно ли поле для записи в формах или нет.

9

label = "Field Name"

Это метка, которая будет использоваться для этого поля в формах.

В define_table метод также принимает три именованных аргумента -

Синтаксис

db.define_table('....',migrate=True, fake_migrate=False, format = '%(id)s')
  • migrate = True - Это указывает web2py создать таблицу, если она не существует, или изменить ее, если она не соответствует определению модели.

  • fake_migrate = False - Если модель соответствует содержимому таблицы базы данных, установите fake_migrate = True, что поможет web2py восстановить данные.

  • format = '%(id)s' - Это строка формата, которая определяет, как должны быть представлены записи в данной таблице.

Генерация необработанного SQL

Используя DAL, мы можем установить соединение с базой данных и создавать новые таблицы и их поля, используя конструктор таблиц и конструктор полей.

Иногда необходимо сгенерировать операторы SQL, чтобы обеспечить необходимый вывод. web2py включает в себя различные функции, которые помогают в генерации необработанного SQL, которые приведены ниже:

_insert

Это помогает получить операторы вставки для данной таблицы. Например,

print db.person._insert(name ='ABC')

Он получит оператор вставки для таблицы с именем «человек».

Вывод оператора SQL -

INSERT INTO person(name) VALUES ('ABC');

_count

Это помогает получить оператор SQL, который дает количество записей. Например, рассмотрим таблицу с именем «человек», и нам нужно найти количество людей с именем «ABC».

print db(db.person.name ==' ABC ')._count()

Вывод оператора SQL -

SELECT count(*) FROM person WHERE person.name = ' ABC ';

_Выбрать

Это помогает в выборке операторов SQL. Например, рассмотрим таблицу с именем «человек», и нам нужно найти список лиц с именем «ABC».

print db(db.person.name == ' ABC ')._select()

Вывод оператора SQL -

SELECT person.name FROM person WHERE person.name = ' ABC ';

_удалять

Это помогает получить delete SQLзаявления. Например, рассмотрим таблицу с именем 'person', и нам нужно удалить операторы с именем 'ABC'

print db(db.person.name == ' ABC ')._delete()

Вывод оператора SQL -

DELETE FROM person WHERE person.name = ' ABC ';4

_Обновить

Это помогает получать обновленные операторы SQL. Например, рассмотрим таблицу с именем «человек», и нам нужно обновить имя столбца с другим значением.

print db(db.person.name == ' ABC ')._update()

Вывод оператора SQL -

UPDATE person SET WHERE person.name = ’Alex’;

Проблемы с DAL (Попадания)

SQLite

В SQLite отсутствует поддержка удаления или изменения столбцов. Удаление поля из таблицы сохраняет его активным в базе данных, из-за чего web2py не будет знать ни о каких сделанных изменениях.

В этом случае необходимо установить fake_migrate = True который поможет переопределить метаданные таким образом, чтобы любые изменения, такие как alter или delete, оставались в ведении web2py.

SQLite не поддерживает логические типы. Для этого web2py внутренне отображает логические значения в 1 символьную строку, где 'T' и 'F' представляютtrue и False соответственно.

MySQL

MySQL не поддерживает функцию ALTER TABLE. Таким образом, миграция базы данных включает несколько коммитов. Этой ситуации можно избежать, установив параметрfake_migrate = True при определении базы данных, в которой сохранятся все метаданные.

Oracle

Oracle не поддерживает функцию разбиения на страницы записей. Также отсутствует поддержка ключевых слов OFFSET или limit. Для этого web2py выполняет разбиение на страницы с помощью сложного трехстороннего вложенного выбора DAL. DAL должен обрабатывать разбиение на страницы самостоятельно, если использовалась база данных Oracle.