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.