0

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

local env = assert(luasql.sqlite()) -- Create a database environment object
local conn = assert(env:connect("cloud.db")) -- Open a database file
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)

变量的值为:

插入天堂(ID,名称,TID)值(1,“ESP-HEAVEN”,“1421856859”);

所以应该执行这个命令。当我在带有 sqlite3 的 putty 中使用该命令时,它工作正常。真的,我不明白为什么这不起作用....

4

1 回答 1

0

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-16T14:38:19.997 回答