前言
浏览NodeMCU的文档,发现多了一个sqlite3模块,我的项目要在本地保存数据,然后在需要时读取,之前的思路是使用文件系统保存,毕竟NodeMCU使用了文件系统,相比SDK开发直接在flash里保存已经方便很多了.测试了一下,打开一个数据库要使用7248B的内存,对于内存拮据的NodeMCU来说是有些奢侈了.
语法记录
具体的sqlite语法就不记录了,自己项目可能用到的记录下
基本语法
打开与关闭数据库:
db=sqlite3.open_memory()
db:close()
创建表:
sql_exec=[[
CREATE TABLE test (id INTEGER PRIMARY KEY, content);
INSERT INTO test VALUES (NULL, 'Hello, World');
INSERT INTO test VALUES (NULL, 'Hello, Lua');
INSERT INTO test VALUES (NULL, 'Hello, Sqlite3');
]]
db:exec(sql_exec)
指定主键类型为INTEGER
后可以自动升序添加id.
删除表:
exe_sql=[[
DROP TABLE test;
]]
db:exec(exe_sql)
读取表数据:
sql=[[
SELECT * FROM test
WHERE id%3==0;
]]
for row in db:rows(sql) do
print(row.id, row.content)
end
for row in db:nrows(sql) do
print(row.id, row.content)
end
for id,content in db:urows(sql) do
print(id, content)
end
输出如下:
1 1
2 Hello, World
1 2
2 Hello, Lua
1 3
2 Hello, Sqlite3
id 1
content Hello, World
id 2
content Hello, Lua
id 3
content Hello, Sqlite3
1 Hello, World
2 Hello, Lua
3 Hello, Sqlite3
功能函数:
储存数据:
function save_data(tb,data)
local keys = {}
local values = {}
db = sqlite3.open_memory()
exe_sql = "INSERT INTO"..tb.."("
for k, v in pairs(data) do
table.insert(keys, k)
table.insert(values, v)
end
for i, v in ipairs(keys) do
if i > 1 then
exe_sql = exe_sql .. "," .. v
else
exe_sql = exe_sql .. v
end
end
for i,v in ipairs(values) do
if type(v)=='string' then
v='"'..v..'"'
end
if i > 1 then
exe_sql = exe_sql .. "," .. v
else
exe_sql = exe_sql .. ') VALUES ('..v
end
end
exe_sql = exe_sql..');'
print("@break",exe_sql)
db:exec(exe_sql)
db:close()
end
测试了下,大概需要2576B的内存开销.
读取数据:
因为数据量可能较大,不好直接返回引起内存溢出,设计回调函数处理较好.
function read_data(exe_sql,callback)
db = sqlite3.open_memory()
db:exec(exe_sql)
for row in db:nrows(sql) do
callback(row)
end
db:close()
end