1. 程式人生 > 其它 >Ubuntu下LuaLaTeX訪問PostgreSQL資料庫的方法示例

Ubuntu下LuaLaTeX訪問PostgreSQL資料庫的方法示例

在Ubuntu作業系統下,LuaLaTeX通過Lua程式訪問PostgreSQL資料庫的方法介紹。

有時候我們需要在文件中插入來自資料庫的資料資料,在沒有程式幫忙的情況下會很麻煩。好在LuaLaTeX可以呼叫Lua程式,通過Lua程式我們可以訪問資料庫。實際上通過Lua程式可以把我們的文件與各種各樣的計算機系統連線起來。

雖然LuaLaTeX沒有其他LaTeX的漢字支援好,但因為有了Lua程式的強大加持,極大地拓展了LaTeX的功能。對於會程式設計的朋友,在使用LaTeX時,強烈推薦使用LuaLaTeX。

下面列出Ubuntu下,LuaLaTeX訪問PostgreSQL資料庫的方法步驟。實際上很簡單。

環境

  • Ubuntu 20.04
  • Lua 5.3
  • PostgreSQL 12.8

前期準備

1. 安裝好PostgreSQL資料庫
2. 建立好資料庫及相關表格等

在本示例中,建立了測試用的資料庫test,並在此資料庫中建立了表roster。為測試已在roster表中加入3條資料。

3. 安裝latex

為了省事,直接全部安裝吧:

sudo apt install texlive-full

關鍵元件

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
--]]

-- 部落格園,繁星間漫步,陸巍的部落格
-- 定義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
% 部落格園,繁星間漫步,陸巍的部落格
\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等工具來實現也可以,但比較麻煩,這裡不建議使用。

建立起與資料庫的聯絡後,實際上可以做的事很多,並不侷限於簡單的讀取資料來顯示。與其他資料庫的連線方法暫時不介紹,等我用到的時候再說吧。