Учебники

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

Уровень абстракции базы данных (DAL) считается основным преимуществом web2py. DAL предоставляет простой интерфейс прикладного программирования (API) для базового синтаксиса SQL.

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

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

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

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

  • Основным преимуществом использования 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, за исключением добавления и удаления столбцов.

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

Один из них заключается в том, что он не применяет типы столбцов, и в нем нет ALTER TABLE, за исключением добавления и удаления столбцов.

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

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

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

Например —

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

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

Sr.No Аргументы и использование
1

Название поля

Название поля в табл.

2

Тип поля

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

3

длина

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

4

по умолчанию = нет

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

5

обновление = нет

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

6

Ненулевой

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

7

читаемый = True

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

8

доступный для записи = True

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

9

label = «Имя поля»

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

Название поля

Название поля в табл.

Тип поля

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

длина

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

по умолчанию = нет

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

обновление = нет

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

Ненулевой

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

читаемый = True

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

доступный для записи = True

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

label = «Имя поля»

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

Метод 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’ — это строка формата, которая определяет, как должны быть представлены записи в данной таблице.

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')

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

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

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

_count

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

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

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

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

_Выбрать

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

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

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

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

_удалять

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

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

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

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

_Обновить

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

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

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

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

Проблемы с DAL (Gotchas)

SQLite

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

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

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

MySQL

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

оракул

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