使用Luasql和sqlite3进行DB-File通信失败

我正在尝试使用luasql和sqlite3来通信我的数据库。我已经通过许多网站自学并找到了一些示例。但是有很多不同的方法似乎可以使用luasql。但对我来说,似乎没有一种是有效的...我真的很沮丧,不知道该怎么办。以下代码片段对我来说无法从表中选择任何内容

local env = assert(luasql.sqlite()) -- 创建一个数据库环境对象
local conn = assert(env:connect("cloud.db")) -- 打开一个数据库文件
conn:execute(string.format([[INSERT INTO HEAVEN VALUES ('%s', '%s', '%s', '0', '0', '%s')]], id, name, tid, date))
cur = conn:execute(string.format([[SELECT TID FROM HEAVEN]]))
devtid = cur.fetch({}, "n")

当我使用引号(")而不是2个方括号([[ ]]),或者添加其他引号,如下面的代码片段所示,对我来说也不起作用

conn:execute(string.format("\"INSERT INTO HEAVEN VALUES ('%s', '%s', '%s', '0', '0', '%s')\"", id, name, tid, date))

甚至在我使用

conn:execute("INSERT OR REPLACE INTO HEAVEN VALUES (0,0,0,0,0,0)")

不插入一些交接的值和格式化字符串它也不起作用...

我真的不知道该怎么办。有人能帮帮我吗?

编辑:我尝试了你的变体@kingJulien,并将其保存在一个变量中,以在执行前打印该命令:

local query = string.format([[INSERT INTO HEAVEN(ID, NAME, TID) VALUES (]] .. tonumber(id) .. [[,"]] .. name .. [[","]] .. tid .. [[");]])
trace(query)
conn:execute(query)

该变量的值是:

INSERT INTO HEAVEN(ID, NAME, TID) VALUES (1,"ESP-HEAVEN","1421856859");

所以应该执行这个命令。当我在putty上使用sqlite3执行该命令时,它可以正常工作。实际上,我不明白为什么这不起作用....

点赞
用户7253993
用户7253993

luasql 中,当您要执行查询时,需要使用方括号 [[ ]] 和运算符 .. 来指定值。因此,您的代码应该写成:

[[INSERT INTO HEAVEN (id, name, tid, date) ]] .. [[ VALUES (]] .. id_param ..[[,]] .. name_param .. [[,]] ..tid_param.. [[,]] ..date_param .. [[);]]

其中,id_param,name_param,tid_param,date_param 是包含要插入到 HEAVEN 表中的值的变量。

此外,根据您的数据库字段类型,您可能需要将变量包装在 tostring()tonumber() 函数中。

2018-03-16 14:38:19