sqlite中实现内存表与文件表的共存
在做一个边缘设备的开发时,自定义类型不够灵活。想到将运行中的数据保存到数据库中来处理。
随着想法的不断改进,最终确定在一个数据库中,(变化多,或者不怕丢失的)运行中的数据存放于内存表中,配置信息存放于文件表中。
以rust的sqlite库 rusqlite为例。
连接文件数据库,如果文件不存在,api自动创建数据库文件。所以得额外判断下,文件数据库是否存在;在这里直接判断所需要的表来实现。我的方式不是读取master表。
创建文件数据库,rust自动drop连接。完美。
match rusqlite::Connection::open(db_path){ Ok(_conn) => { // 测试表的存在。Err,不存在表,则创建表 modbus。 match _conn.prepare("SELECT id FROM modbus LIMIT 1") { Ok(_) => println!("global, table ‘modbus’ in the file db"), Err(e) => { println!("global, first. {:?}", e); match _conn.execute(table_modbus, []){ Ok(m) => println!("global, create table ‘modbus’ in the file db, {}", m), Err(e) => { println!("global, create table ‘modbus’ err, {}", e); return; }, }; // 创建表 modbus match _conn.execute(dbt_lights, []){ Ok(n) => println!("global, insert table ‘node’ in the file db, {}", n), Err(e) => { println!("global, insert table ‘node’ err, {}", e); }, }; // todo, insert modbus data }, } }, Err(e) => { println!("global, create file db err, {:?}", e); return; }, }
(在代码段落的后面添加注释,这样,代码折叠后依然能看到这段代码的目的。)
创建内存数据库,并获取连接。
let conn = match rusqlite::Connection::open_in_memory() { Ok(c) => { println!("global, create mem db ok"); c }, Err(e) => { println!("global, create mem db err, {:?}", e); return; }, };
附加文件数据库,失败则退出程序。
match conn.execute("ATTACH DATABASE ?1 AS file_db", [&db_path]) { Ok(v) => println!("global, mem attach {:?}", v), Err(e) => { println!("global, mem attach err, {:?}", e); return; } }
创建内存表
match conn.execute(table_current, []) { Ok(r) => { println!("global mem db create current ok, {}", r); // todo, insert countdown test data match conn.execute(dbt_down, []){ Ok(n) => println!("global mem db, table current insert ok, {}", n), Err(e) => println!("global mem db, table current insert err, {}", e), } }, Err(e) => { println!("global db create current err {}", e); return; }, }