Разработка микро-учётной системы на lua, часть четвёртая. Модуль доступа к базе

Теперь рассмотрим модуль, начиная с самой базы. Она представляет собой набор таблиц с автоинкрементными полями:
image
Таблица содержит в себе пересечение следующих сущностей:
image
Журнал документов здесь — форма дублирования запроса на отображение. Как и все отображения, быстро не обновляется.
На первой схеме стрелками показанны векторы переноса данных из первичных ключей. Каждый из них имеет связь с родительским массивом и создаёт соответствующую схему данных:

  • Телефонный справочник имеет три атрибута: порядковый номер, ссылка на клиента и номер телефона;
  • Справочник клиентов имеет: порядковый номер и наименование клиента;
  • Справочник позиций имеет: порядковый номер, наименование позиции и её стоимость;
  • Каталог документов имеет: порядковый номер, ссылку на клиента, ссылку на позицию и входящие средства.


Исходя из этой схемы, я принял решение разместить отдельный модуль доступа к базе, заставив исполнительные модули формировать запрос внутри себя. По-хорошему, нужно будет сделать функцию для вызова общих представлений, обновления записей и вставки, но я это сделаю позже, ибо есть риск укрупнения библиотеки и повторения функционала (и 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, часть вторая. Постановка задачи», в которой я указываю условия разработки программы и функции, которые на неё возлагаются. Учитывайте это.

© Habrahabr.ru