在Lua用luasql-sqlite3库访问SQLite数据库

用luarocks包管理器安装,注意库名是luasql-sqlite3,另一个相近的库luasql-sqlite会报缺少sqlite.h头文件错误。

复制代码
luarocks install luasql-sqlite
Installing https://luarocks.org/luasql-sqlite-2.6.0-3.src.rock

Error: Could not find header file for SQLITE
  No file sqlite.h in /usr/local/include
  No file sqlite.h in /usr/include
  No file sqlite.h in /include
You may have to install SQLITE in your system and/or pass SQLITE_DIR or SQLITE_INCDIR to the luarocks command.
Example: luarocks install luasql-sqlite SQLITE_DIR=/usr/local

whereis sqlite.h
sqlite.h:
whereis sqlite3.h
sqlite3.h: /usr/include/sqlite3.h

安装,卡在克隆阶段,从现象看是连接github超时

复制代码
luarocks install luasql-sqlite3
Installing https://luarocks.org/luasql-sqlite3-2.7.0-1.rockspec
Cloning into 'luasql'...
^C
Error: Failed cloning git repository.

手工下载包规格脚本

复制代码
wget  https://luarocks.org/luasql-sqlite3-2.7.0-1.rockspec
--2025-10-29 12:35:35--  https://luarocks.org/luasql-sqlite3-2.7.0-1.rockspec
Resolving luarocks.org (luarocks.org)... 45.33.61.132
Connecting to luarocks.org (luarocks.org)|45.33.61.132|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 894 [text/x-rockspec]
Saving to: 'luasql-sqlite3-2.7.0-1.rockspec'

luasql-sqlite3-2.7.0-1.rocksp 100%[=================================================>]     894  --.-KB/s    in 0s

2025-10-29 12:35:36 (2.73 MB/s) - 'luasql-sqlite3-2.7.0-1.rockspec' saved [894/894]

内容如下

复制代码
package = "LuaSQL-SQLite3"
version = "2.7.0-1"
source = {
  url = "git+https://github.com/lunarmodules/luasql.git",
  branch = "2.7.0",
}
description = {
   summary = "Database connectivity for Lua (SQLite3 driver)",
   detailed = [[
      LuaSQL is a simple interface from Lua to a DBMS. It enables a
      Lua program to connect to databases, execute arbitrary SQL statements
      and retrieve results in a row-by-row cursor fashion.
   ]],
   license = "MIT/X11",
   homepage = "https://lunarmodules.github.io/luasql/"
}
dependencies = {
   "lua >= 5.1"
}
external_dependencies = {
   SQLITE = {
      header = "sqlite3.h"
   }
}
build = {
   type = "builtin",
   modules = {
     ["luasql.sqlite3"] = {
       sources = { "src/luasql.c", "src/ls_sqlite3.c" },
       libraries = { "sqlite3" },
       incdirs = { "$(SQLITE_INCDIR)" },
       libdirs = { "$(SQLITE_LIBDIR)" }
     }
   }
}

将url改为能连上的地址比如url = "git+https://bgithub.xyz/lunarmodules/luasql.git",重新安装这个脚本,就能顺利克隆继续编译了。

复制代码
luarocks install luasql-sqlite3-2.7.0-1.rockspec
Cloning into 'luasql'...
remote: Enumerating objects: 3263, done.
remote: Counting objects: 100% (138/138), done.
remote: Compressing objects: 100% (88/88), done.
remote: Total 3263 (delta 78), reused 53 (delta 50), pack-reused 3125 (from 3)
Receiving objects: 100% (3263/3263), 951.33 KiB | 243.00 KiB/s, done.
Resolving deltas: 100% (1998/1998), done.
Note: switching to 'bbd459e150e3fcc328aac1d794d6fdf62f1ce9e4'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false



luasql-sqlite3 2.7.0-1 depends on lua >= 5.1 (5.4-1 provided by VM: success)
gcc -O2 -fPIC -I/usr/local/include -c src/luasql.c -o src/luasql.o -I/usr/include
gcc -O2 -fPIC -I/usr/local/include -c src/ls_sqlite3.c -o src/ls_sqlite3.o -I/usr/include
gcc  -shared -o /tmp/luarocks_build-LuaSQL-SQLite3-2.7.0-1-9198867/luasql/sqlite3.so src/luasql.o src/ls_sqlite3.o -L/usr/lib/x86_64-linux-gnu -Wl,-rpath,/usr/lib/x86_64-linux-gnu -lsqlite3
luasql-sqlite3 2.7.0-1 is now installed in /usr/local (license: MIT/X11)

使用

luasql-sqlite3没有专门的示例,在http://lunarmodules.github.io/luasql/examples.html找到一个postgreSQL示例,将相关的数据库字符串改为SQLite3就能执行了。

lua 复制代码
-- load driver
local driver = require "luasql.postgres"  --修改为local driver = require "luasql.sqlite3" 
-- create environment object
env = assert (driver.postgres()) --修改为env = assert (driver.sqlite3())
-- connect to data source
con = assert (env:connect("luasql-test"))
-- reset our table
res = con:execute"DROP TABLE people"
res = assert (con:execute[[
  CREATE TABLE people(
    name  varchar(50),
    email varchar(50)
  )
]])
-- add a few elements
list = {
  { name="Jose das Couves", email="jose@couves.com", },
  { name="Manoel Joaquim", email="manoel.joaquim@cafundo.com", },
  { name="Maria das Dores", email="maria@dores.com", },
}
for i, p in pairs (list) do
  res = assert (con:execute(string.format([[
    INSERT INTO people
    VALUES ('%s', '%s')]], p.name, p.email)
  ))
end
-- retrieve a cursor
cur = assert (con:execute"SELECT name, email from people")
-- print all rows, the rows will be indexed by field names
row = cur:fetch ({}, "a")
while row do
  print(string.format("Name: %s, E-mail: %s", row.name, row.email))
  -- reusing the table of results
  row = cur:fetch (row, "a")
end
-- close everything
cur:close() -- already closed because all the result set was consumed
con:close()
env:close()

执行,成功地写入并读取出了数据。

复制代码
lua sqli2.lua
Name: Jose das Couves, E-mail: jose@couves.com
Name: Manoel Joaquim, E-mail: manoel.joaquim@cafundo.com
Name: Maria das Dores, E-mail: maria@dores.com
相关推荐
廋到被风吹走8 小时前
【数据库】【MySQL】InnoDB外键解析:约束机制、性能影响与最佳实践
android·数据库·mysql
掘根8 小时前
【消息队列】交换机数据管理实现
网络·数据库
Logic1018 小时前
《Mysql数据库应用》 第2版 郭文明 实验6 数据库系统维护核心操作与思路解析
数据库·sql·mysql·学习笔记·计算机网络技术·形考作业·国家开放大学
AI Echoes9 小时前
构建一个LangChain RAG应用
数据库·python·langchain·prompt·agent
@nengdoudou9 小时前
KingbaseES支持 mysql 的find_in_set函数
数据库·mysql
摇滚侠10 小时前
面试实战 问题三十三 Spring 事务常用注解
数据库·spring·面试
梁萌10 小时前
保姆级的MySQL执行计划(Explain)解读
数据库·mysql·explain·执行计划
JIngJaneIL10 小时前
基于Java+ vue智慧医药系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
+VX:Fegn089510 小时前
计算机毕业设计|基于springboot + vue图书管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
杨云龙UP11 小时前
MySQL 8.0.x InnoDB 写入链路优化:Redo Log 与 Buffer Pool 扩容与缓冲区调优实战记录-20251029
linux·运维·数据库·sql·mysql