Разработка микро-учётной системы на lua, часть четвёртая. Модуль доступа к базе
Теперь рассмотрим модуль, начиная с самой базы. Она представляет собой набор таблиц с автоинкрементными полями:
Таблица содержит в себе пересечение следующих сущностей:
Журнал документов здесь — форма дублирования запроса на отображение. Как и все отображения, быстро не обновляется.
На первой схеме стрелками показанны векторы переноса данных из первичных ключей. Каждый из них имеет связь с родительским массивом и создаёт соответствующую схему данных:
- Телефонный справочник имеет три атрибута: порядковый номер, ссылка на клиента и номер телефона;
- Справочник клиентов имеет: порядковый номер и наименование клиента;
- Справочник позиций имеет: порядковый номер, наименование позиции и её стоимость;
- Каталог документов имеет: порядковый номер, ссылку на клиента, ссылку на позицию и входящие средства.
Исходя из этой схемы, я принял решение разместить отдельный модуль доступа к базе, заставив исполнительные модули формировать запрос внутри себя. По-хорошему, нужно будет сделать функцию для вызова общих представлений, обновления записей и вставки, но я это сделаю позже, ибо есть риск укрупнения библиотеки и повторения функционала (и fetch, по хорошему, лучше делать в исполнительном модуле):
Модуль database.lua:
local database = {}
function database.link()
driver = require "luasql.sqlite3"
env = driver.sqlite3()
db = env:connect("standart.sqlite3")
return db
end
return database
Здесь в модуле создаётся экземпляр модуля управления базой luasql.sqlite3, инициализируется драйвер базы, затем ему скармливается сама база. Активация запроса в исполнительном модуле происходит следующим образом:
base = require "database"
query = base.link() --[[ Вызов модуля базы и линковка экземпляра запроса --]]
str = 'SELECT number, name FROM customer;'
thread = query:execute(str)
data = thread:fetch({}, "a") --[[ Формирование запроса, исполнение и парсинг данных --]]
while data do
print("| № " .. data.number .. " | " .. data.name .. " | ")
data = thread:fetch(data, "a") --[[ Получаем данные построчно и выводим также, как из обычной таблицы в Lua --]]
end
За сим откланяюсь. В следующей статье распишу работу управляющего модуля.
P.S. Маленькая просьба — если хотите передать замечание по этому циклу статей, прошу предварительно прочитать статью «Разработка микро-учётной системы на lua, часть вторая. Постановка задачи», в которой я указываю условия разработки программы и функции, которые на неё возлагаются. Учитывайте это.