有时候我们需要在文档中插入来自数据库的数据资料,在没有程序帮忙的情况下会很麻烦。好在LuaLaTeX可以调用Lua程序,通过Lua程序我们可以访问数据库。实际上通过Lua程序可以把我们的文档与各种各样的计算机系统连接起来。
虽然LuaLaTeX没有其他LaTeX的汉字支持好,但因为有了Lua程序的强大加持,极大地拓展了LaTeX的功能。对于会编程的朋友,在使用LaTeX时,强烈推荐使用LuaLaTeX。
下面列出Ubuntu下,LuaLaTeX访问PostgreSQL数据库的方法步骤。实际上很简单。
环境
—— Ubuntu 20.04
—— Lua 5.3
—— PostgreSQL 12.8
前期准备 1. 安装好PostgreSQL数据库
方法不清楚的话请看我的另一篇博客PostgreSQL之Ubuntu 20.04下的简单安装与相关设置。这里不再赘述。
2. 创建好数据库及相关表格等在本示例中,创建了测试用的数据库test,并在此数据库中创建了表roster。为测试已在roster表中加入3条数据。
3. 安装latex为了图省事,直接全部安装吧:
sudo apt install texlive-full关键组件
前面的准备工作完成后,如果我们马上用lualatex命令来编译包含有连接PostgreSQL数据库代码的latex文档时,会出现以下错误:
从图中可以看出是缺乏luasql.so链接库。下面我们就来安装:
sudo apt install lua-sql-postgres
安装之后,并不能直接使用,因为名称与位置都不在lualatex的默认搜索内,需要做一些修改。先创建目录:/usr/local/lib/lua/5.3/,然后执行以下命令:
sudo cp /usr/lib/x86_64-linux-gnu/liblua5.3-sql-postgres.so.2 /usr/local/lib/lua/5.3/luasql.so
这里要注意,有可能liblua5.3-sql-postgres.so.2这个文件不在以上这个目录内,如果不在,请大家自己用find命令查找。
做好以上工作后再执行lualatex命令就可以通过了。
示例代码 1. test1.lua--[[
@file test1.lua
@brief LuaLaTeX访问PostgreSQL数据库示例文件
@copyright MIT
@author 陆巍
@version 1.0.0
@date 2021-10-16
--]]
-- CSDN,繁星间漫步,陆巍的博客
-- 定义visitPG类
VisitPG = {
code = "",
}
function VisitPG:new(o, str)
o = o or {}
setmetatable(o, self)
self.__index = self
self.code = str
return o
end
-- @brief 访问PostgreSQL数据库
function VisitPG:Visit()
local luasql = require 'luasql.postgres'
local envv = luasql.postgres()
local con = assert (envv:connect('test', 'starry', 'password123', "127.0.0.1", 5432))
local cur = assert(con:execute"SELECt * from roster")
local row = cur:fetch({}, "a")
local str1 = ""
while row do
str1 = str1 .. row.id .. "; " .. row.name .. "; " .. row.age .. "; " .. row.id .. "; " .. "\\"
row = cur:fetch(row, "a")
end
cur:close()
con:close()
envv:close()
return str1
end
--[[
local luasql = require "luasql.postgres"
local env = luasql.postgres()
local con = assert (env:connect('test', 'starry', 'belighT928s', "127.0.0.1", 5432))
local cur = assert (con:execute"SELECt * from roster")
local row = cur:fetch ({}, "a")
while row do
print(string.format("%20s %-15d %-15d", row.name, row.age, row.id))
row = cur:fetch (row, "a")
end
cur:close()
con:close()
env:close()
]]--
代码很简单,不做解释了,记住最后的扫尾工作。代码中最下面注释掉的内容是用于独立的lua命令测试。
2. test1.tex% CSDN,繁星间漫步,陆巍的博客
documentclass{article}
usepackage{ctex}% 中文支持
usepackage{geometry}% 用于页面设置
usepackage{luacode}% lua支持
% 设置为A4纸,边距适中模式(参考永中office)
geometry{
width = 210mm,
height = 297mm,
left = 19.1mm,
right = 19.1mm,
top = 25.4mm,
bottom = 25.4mm
}
begin{document}
begin{center}
huge LuaLaTeX访问PostgreSQL数据库示例
luaexec{
require("test1")
local pg = VisitPG:new(nil, "")
tex.sprint(pg:Visit())
}
end{center}
end{document}
编译后生成的pdf文档如下:
虽然用luarocks等工具来实现也可以,但比较麻烦,这里不建议使用。
建立起与数据库的联系后,实际上可以做的事很多,并不局限于简单的读取数据来显示。与其他数据库的连接方法暂时不介绍,等我用到的时候再说吧。



