使用lsqlite3插入数据时出现stmt为nil的错误求助
解决lsqlite3中prepare返回nil的问题
你的错误attempt to index local 'stmt' (a nil value)本质是db:prepare()调用失败,没有生成有效的预处理语句对象。按以下步骤排查修复:
1. 先捕获prepare的错误信息
lsqlite3的prepare方法执行失败时,会返回nil加上具体错误描述字符串。修改代码捕获错误,就能直接定位失败原因:
local stmt, err = db:prepare [[INSERT INTO tips_table (time, date, counter) VALUES (?, ?, ?);]] if not stmt then print("Prepare failed: " .. err) return end stmt:bind_values(os.date('%H:%M:%S'), os.date('%Y-%m-%d'), counter) -- 注意:绑定后要执行语句并关闭预处理对象 stmt:step() stmt:finalize()
2. 常见失败原因及修复
数据库连接无效
先确认db是正常打开的数据库实例,打开时也要捕获错误:
local sqlite3 = require("lsqlite3") local db, open_err = sqlite3.open("your_db_file.db") if not db then print("Open database failed: " .. open_err) return end
SQL日期格式不匹配SQLite要求
SQLite的DATE类型仅识别YYYY-MM-DD格式,你当前用os.date('%y/%m/%d')生成的是YY/MM/DD(比如24/05/20),不符合规范。改成os.date('%Y-%m-%d')生成标准格式的日期字符串。
变量counter未定义或类型错误
确保counter是有效的整数类型,如果是nil或非数值,可能间接导致流程出错(先确认变量已正确赋值)。
3. 完整可运行示例代码
local sqlite3 = require("lsqlite3") local db, open_err = sqlite3.open("test.db") if not db then print("Open DB failed: " .. open_err) return end -- 创建表并检查结果 local create_code, create_err = db:exec [[CREATE TABLE IF NOT EXISTS tips_table (id INTEGER PRIMARY KEY,time TIME,date DATE, counter INTEGER)]] if create_code ~= sqlite3.OK then print("Create table failed: " .. create_err) db:close() return end local counter = 1 -- 示例计数器值 local stmt, err = db:prepare [[INSERT INTO tips_table (time, date, counter) VALUES (?, ?, ?);]] if not stmt then print("Prepare failed: " .. err) db:close() return end -- 绑定值并执行插入 stmt:bind_values(os.date('%H:%M:%S'), os.date('%Y-%m-%d'), counter) local step_code = stmt:step() if step_code ~= sqlite3.DONE then print("Insert failed: " .. db:errmsg()) end stmt:finalize() db:close()
内容的提问来源于stack exchange,提问作者kaygee
相关产品推荐
相关产品推荐

