在NodeMCU中使用sqlite3

前言

浏览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

猜你喜欢

转载自blog.csdn.net/qq_37258787/article/details/79945157