Использование SQLite для создания документации и конфигураций программного обеспечения


Использование SQLite для создания документации и конфигураций программного обеспечения

Почему вы хотите использовать SQLite для ведения документации? Или использовать его для управления файлами конфигурации программного обеспечения?

В этой статье я объясняю преимущества и показываю, как использовать SQLite для создания документации.

Я веду несколько документов для крупного проекта в области здравоохранения. В документах одни и те же данные отображаются по-разному в зависимости от целевой аудитории документа.

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

Вместо того чтобы пытаться вести эти два документа по отдельности и потенциально нарушать их синхронизацию, я решил использовать SQLite для хранения центральной копии данных и использовать запросы SQL (Structured Query Language) для создания необходимых кодов форматирования документации.

SQLite использует единственную команду терминала для доступа ко всем своим функциям. Эта команда, sqlite3, упрощает процесс создания документов. Возможность объединять команды SQLite в цепочки делает процесс гибким и повторяемым. Кроме того, результаты работы этих команд можно передавать во внешние файлы. Большинство процессов создания документации могут включать эти внешние файлы, обеспечивая представление в документе самых последних данных.

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

Кроме того, поскольку весь процесс выполняется по сценарию, в моем случае с помощью make, командами, создающими документацию, можно управлять с помощью контроля исходного кода. Использование системы версий исходного кода, например Git GNU Make, позволяет отслеживать историю изменений, внесенных в данные документации.

Типы документов

Набор данных, который я поддерживаю, представляет собой список типов медицинских документов, используемых в региональной системе обмена медицинской информацией.
Набор данных содержит три поля: название документа, клинический код и схема. Я храню список в простом файле данных с разделителями-запятыми (CSV), например:

Discharge Letter,823701000000103,SNOMED-CT
Drug/substance use,1064501000000103,SNOMED-CT
End of Life Care Document,861411000000103,SNOMED-CT
Войти в полноэкранный режим Выход из полноэкранного режима

Импорт данных в SQLite

CSV-файл является моим основным источником данных. Если мне нужно изменить какую-либо запись, я изменяю ее в CSV-файле, а затем повторно обрабатываю данные. Если я добавляю новый тип документа на биржу здравоохранения, я добавляю запись в CSV-файл, а затем запускаю make load для загрузки данных в SQLite для дальнейшей обработки.

Я использую GNU Make для запуска нужных мне команд.
Использовать make необязательно. Если вам привычнее использовать сценарии bash или пакетные файлы Windows, то используйте их. Для меня система make — это простой способ сгруппировать набор команд.

Система make читает makefile в папке вашего проекта. Makefile содержит команды, которые вы хотите выполнить в том порядке, в котором вы хотите их выполнить. Makefile может иметь несколько целей; они обозначаются ключевым словом, за которым следует символ двоеточия. Когда вы выполняете команду make, за которой следует имя цели, будут выполняться только команды, входящие в этот раздел.

Я использую две цели в своем makefile, что упрощает загрузку данных и подготовку документации. Приведенный ниже код показывает команды SQLite, которые я использую для импорта CSV-файла в таблицу базы данных.

load:
    sqlite3 -cmd ".read create_tables.sql"
            -cmd ".mode csv"
            -cmd ".import document_types.csv document_types"
            document_types.db < count.sql
Войти в полноэкранный режим Выход из полноэкранного режима

Параметр -cmd утилиты командной строки sqlite3 позволяет указать, какие команды необходимо выполнить. Нам нужно использовать несколько последовательностей -cmd, чтобы выполнить нужные нам команды по порядку. В приведенном выше примере мы начинаем с чтения и выполнения SQL-запросов в файле create_tables.sql, который удаляет и заново создает таблицу типов документов в файле базы данных document_types.db.

Затем мы переключаем режим работы на CSV перед импортом CSV-файла. Команда .import имеет два параметра. Первый параметр — это имя файла CSV, содержащего ваши данные. Второй параметр указывает SQLite, в какую таблицу следует импортировать данные. Наконец, мы читаем и выполняем файл count.sql, который подсчитывает количество записей в таблице и выводит его на экран терминала.

SQL-код создания таблицы

Приведенный ниже код SQL показывает содержимое файла create_tables.sql. Он начинается с удаления таблицы document_types, чтобы очистить ее от старых данных, а затем заново создает таблицу, предоставляя определения столбцов.

DROP TABLE IF EXISTS document_types;

CREATE TABLE document_types (
    "name"      TEXT,
    "code"      TEXT,
    "scheme"    TEXT
);
Вход в полноэкранный режим Выход из полноэкранного режима

Содержимое файла count.sql показано ниже.

SELECT COUNT(*) || ' : Records Imported'
  FROM document_types;
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь у нас есть наши данные в файле базы данных SQLite; мы можем приступить к созданию кода документации.

Создание кода документации

Не имеет значения, какую систему документации вы используете; все они обычно поддерживают включение файлов. LaTex, Asciidocter и DocBook поддерживают включение файлов. Главное — заставить SQLite производить вывод в формате, который требует ваша система документации.

Лично я использую LaTeX, и код для отображения данных в таблице показан ниже:

section*{Document Types}
begin{center}
    begin{tabular}{p{8cm} p{3cm} p{2.7cm} }
        bfseries{Value} & bfseries{Node} & bfseries{Schema} \
        toprule
            input{doc-types-table.tex}
        bottomrule
    end{tabular}
end{center}
Войти в полноэкранный режим Выйти из полноэкранного режима

В приведенном выше фрагменте кода интерес представляет строка, в которой говорится input{doc-types-table.tex}. Эта строка указывает системе LaTeX импортировать команды, содержащиеся в файле под названием doc-types-table.tex.
Нам нужно заставить SQLite сгенерировать этот файл с данными и правильными кодами форматирования, чтобы отобразить их как часть таблицы.

Формат LaTeX для строки таблицы показан ниже.
Символ амперсанда разделяет каждый столбец в таблице. Конец каждой строки обозначается двумя символами обратной косой черты. Команда midrule создает тонкую линию между строками таблицы.

Discharge Letter & 823701000000103 & SNOMED-CT \ midrule 
Вход в полноэкранный режим Выход из полноэкранного режима

Поэтому нам нужна команда SQLite SQL для вывода данных в указанном выше формате. SQL, который я использую, показан ниже. Используется конструкция SQLite || для конкатенации (объединения) полей данных вместе, разделенных символами амперсанда. SQL-оператор также сортирует данные в порядке имен, ограничивая количество возвращаемых записей до 30, поскольку на данной странице помещается только 30 записей.

SELECT name || ' & ' || code || ' & ' || scheme || ' \ midrule ' AS LaTeX
  FROM document_types
 ORDER BY name
 LIMIT 0, 30;
Вход в полноэкранный режим Выход из полноэкранного режима

Если вышеприведенный SQL сохранить в файл publishing_standards_page.sql, то мы можем обновить наш makefile, включив в него цель docs:, чтобы мы могли выполнять команду *make docs» каждый раз, когда хотим заново сгенерировать документацию.

Команда SQLite немного отличается, поскольку мы переключаемся в режим списка и перенаправляем вывод в файл doc-types-table.tex в папке проекта LaTeX.

docs:
    sqlite3 -cmd ".mode list"
        document_types.db
        < publishing_standards_page.sql
        > /path/to/latex/doc-types-table.tex
Вход в полноэкранный режим Выход из полноэкранного режима

Как только вы поймете, что ваша база данных генерирует вашу документацию, вы сможете автоматизировать создание множества различных документов для разных аудиторий на основе одного и того же набора данных.
Например, у нас есть запрос на документ о новой роли, который пользователи должны заполнить перед определением новых ролей. Этот документ представляет собой PDF-файл, в котором снова перечислены типы документов, но при этом необходимо создать флажки, чтобы люди могли указать, к просмотру каких документов должна иметь доступ новая роль.

LaTeX довольно хорош, поскольку он может создавать формы с PDF. Приведенный ниже SQL сохраняется в файл под названием roles_request_form.sql и генерирует код LaTeX, необходимый для создания PDF-формы. Каждый флажок в форме должен иметь уникальное имя. Поэтому я использовал встроенное в SQLite ключевое слово ROWID, которое возвращает уникальный внутренний номер строки каждой записи.

SELECT name || ' & CheckBox[name=' || ROWID ||
    ', width=1em, bordercolor={lightgray}]{Yes} \ midrule ' AS LaTeX
  FROM document_types
 ORDER BY name
 LIMIT 0, 30;
Вход в полноэкранный режим Выход из полноэкранного режима

Обновленный makefile показан ниже.

docs:
    sqlite3 -cmd ".mode list"
        document_types.db
        < publishing_standards_page.sql
        > /path/to/latex/doc-types-table.tex
    sqlite3 -cmd ".mode list"
        document_types.db
        < roles_request_form.sql
        > /path/to/latex/doc-roles-form.tex
Вход в полноэкранный режим Выход из полноэкранного режима

Создание конфигураций программного обеспечения

Этот же процесс можно использовать для создания файлов конфигурации программного обеспечения. Медицинская биржа использует XML-файлы для применения ограничительных политик к группам пользователей. Например, клинический пользователь может просматривать все типы документов, кроме двух определенных документов. База данных используется для генерации XML-файлов конфигурации, необходимых программному обеспечению для настройки этих политик.

SELECT
  '<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">' ||
  code  || '</AttributeValue>' AS ClinicalRole
 FROM document_types
WHERE code IN ('149741000000107', '723394009')
GROUP BY code
ORDER BY code;
Вход в полноэкранный режим Выход из полноэкранного режима

Приведенный выше пример SQL извлекает клинические коды документов для двух документов, которые клинический персонал не имеет права просматривать.

config:
    sqlite3 -cmd ".mode list"
        document_types.db
        < clinical_role_restrictions.sql
        > /path/to/software/configs/roles.xml
Войти в полноэкранный режим Выход из полноэкранного режима

Оцените статью
devanswers.ru
Добавить комментарий