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;
    },
}

 

posted @ 2022-07-22 14:38  蓝色牧客  阅读(354)  评论(0编辑  收藏  举报