搭建盘口如何使用飞鸟 SQLite 生成平台系统文档和软件配置开发?
思否用户TG电报duotebb版权,转载请注明出处。
为什么要使用 SQLite 来维护文档?或者用它来管理软件配置文件?
在本文中,我将解释好处并演示如何使用 SQLite 生成文档。
我为一个大型健康项目维护了几份文件。根据文档的目标受众,文档以不同的方式显示相同的数据。
第一个是发布标准列表,第二个是基于角色的访问控制矩阵。数据集随着项目对新用例的响应而增长和演变。拥有从数据生成文档的自动化流程至关重要。
我没有尝试分别维护这两个文档并可能使它们不同步,而是决定使用 SQLite 来保存数据的中央副本并使用 SQL(结构化查询语言)查询来生成所需的文档格式代码。
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中使用了两个目标,使我可以轻松加载数据并生成文档文档。下面的代码显示了我用来将 CSV 文件导入数据库表的 SQLite 命令。
load:
sqlite3 -cmd ".read create_tables.sql"
-cmd ".mode csv"
-cmd ".import document_types.csv document_types"
document_types.db < count.sql
sqlite3命令行实用程序的-cmd参数允许您指定需要执行的命令。我们需要使用多个-cmd序列来依次执行我们需要的命令。在上面的示例中,我们首先读取并运行create_tables.sql文件中的 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"。
当我们切换到列表模式并将输出重定向到LaTeX 项目文件夹中的文件doc-types-table.tex 时,SQLite 命令略有不同。
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的文件中,并生成生成 PDF 表单所需的 LaTeX 代码。表单中的每个复选框都需要有一个唯一的名称。因此,我使用了 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
'
code || '
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