rust调用SQLite实例

rusqlite库介绍

Rusqlite是一个用Rust编写的SQLite库,它提供了对SQLite数据库的操作功能。Rusqlite的设计目标是提供一个简洁易用的API,以便于Rust程序员能够方便地访问和操作SQLite数据库。

Rusqlite的主要特点包括:

  • 遵循Rust的类型系统和所有权模型,提供安全的API设计;
  • 支持异步和同步两种模式,以适应不同的应用场景;
  • 提供丰富的功能,如数据库连接管理、事务处理、查询执行、数据绑定和结果集处理等;
  • 支持自动重连机制,能够在网络中断或其他异常情况下自动恢复连接;
  • 支持多种数据类型的转换,包括字符串、整数、浮点数、日期时间等;
  • 提供详细的文档和示例代码,便于开发者快速上手和使用。

Rusqlite广泛应用于各种需要轻量级数据库支持的Rust项目中,例如Web应用程序、命令行工具、嵌入式设备等。此外,Rusqlite也经常与其他Rust库配合使用,以实现更复杂的功能和需求

下面是库使用案例

目录结构

cargo.toml配置文件

复制代码
[package]
name = "mySQLite"
version = "0.1.0"
edition = "2021"

[dependencies]
rusqlite = { version = "0.31.0", features = ["bundled"] }
[[example]]
name = "createSQLiteDatabase"
path = "examples/SQL/createSQLiteDatabase.rs"
doc-scrape-examples = true

[package.metadata.example.createSQLiteDatabase]
name = "Create SQLite Database"
description = "demonstrates SQLite database create"
category = "SQL Rendering"
wasm = true

执行文件 createSQLiteDatabase.rs 内容

增删改查执行案例

复制代码
use rusqlite::{Connection, Result};
use std::fs;
#[derive(Debug)]
struct Person {
    id: i32,
    name: String,
    data: Option<Vec<u8>>,
}


pub fn main() -> Result<()> {

    let conn = establish_connection();

    // let conn = Connection::open_in_memory()?;
    // let conn = Connection::open("cats.db")?;
    conn.execute(
        "CREATE TABLE  person   (
            id    INTEGER PRIMARY KEY,
            name  TEXT NOT NULL,
            data  BLOB
        ) ",
        (), // empty list of parameters.
    )?;
    let mut me = Person {
        id: 0,
        name: "Steven".to_string(),
        data: None,
    };
    conn.execute(
        "INSERT INTO person (name, data) VALUES (?1, ?2)",
        (&me.name, &me.data),
    )?;



    let mut stmt = conn.prepare("SELECT id, name, data FROM person")?;
    let person_iter = stmt.query_map([], |row| {
        Ok(Person {
            id: row.get(0)?,
            name: row.get(1)?,
            data: row.get(2)?,
        })
    })?;

    for person in person_iter {
        println!("Found person {:?}", person.unwrap());
    }




    /*
    // 删除SQLite数据表
    let _res = conn.execute("DROP TABLE IF EXISTS person;", []);
    println!("{:?}", _res);
    */

 /*
// 删除数据
// 准备删除语句
    let mut statement = conn.prepare("DELETE FROM person")?;

// 执行删除操作
    statement.execute(())?;
    */
   /*
   // 删除数据
// 准备删除语句
    let mut statement = conn.prepare("DELETE FROM person WHERE id =1")?;

// 执行删除操作
    statement.execute(())?;

    */

    // 准备一个SQL更新语句



    //更新数据
    let p = Person{
        id: 1,
        name: "Server".to_string(),
        data: None,
    };
    let mut update_stmt =
        conn.prepare("UPDATE person SET name = ?1 WHERE id = ?2").unwrap();

    update_stmt.execute((p.name,p.id)).unwrap();
    println!("{:?}", update_stmt);

  /*
    let result = conn.execute(
        "UPDATE person SET name = ?1 WHERE id = ?2",
        ( p.name, p.id),
    )?;

    println!("{:?}", result);*/


    ///删除SQLite数据库,库必须是被关闭状态才行
    if fs::metadata("cats.db").is_ok() {
        // 删除数据库文件
        fs::remove_file("cats.db").expect("删除数据库文件失败");
    }

    selectTable(&conn, "NewName");

    Ok(())
}
//获取并返回SQL连接
fn establish_connection() -> rusqlite::Connection {
    // 创建一个内存中的SQLite数据库连接
    match rusqlite::Connection::open_in_memory() {
        Ok(conn) => conn,
        Err(e) => panic!("Failed to open a connection: {:?}", e),
    }
}
//接收SQL连接执行
fn selectTable(conn: &rusqlite::Connection, name: &str) ->Result<()>{

    // let conn = establish_connection();
    let mut stmt = conn.prepare("SELECT id, name, data FROM person")?;
    let person_iter = stmt.query_map([], |row| {
        Ok(Person {
            id: row.get(0)?,
            name: row.get(1)?,
            data: row.get(2)?,
        })
    })?;

    for person in person_iter {
        println!("Found person {:?}", person.unwrap());
    }
    Ok(())
}

代码执行方式

复制代码
cargo run --example createSQLiteDatabase
相关推荐
卓怡学长5 分钟前
m115乐购游戏商城系统
java·前端·数据库·spring boot·spring·游戏
2501_944526427 分钟前
Flutter for OpenHarmony 万能游戏库App实战 - 蜘蛛纸牌游戏实现
android·java·python·flutter·游戏
C+-C资深大佬14 分钟前
C++风格的命名转换
开发语言·c++
No0d1es17 分钟前
2025年粤港澳青少年信息学创新大赛 C++小学组复赛真题
开发语言·c++
点云SLAM20 分钟前
C++内存泄漏检测之手动记录法(Manual Memory Tracking)
开发语言·c++·策略模式·内存泄漏检测·c++实战·new / delete
码上成长25 分钟前
JavaScript 数组合并性能优化:扩展运算符 vs concat vs 循环 push
开发语言·javascript·ecmascript
打工的小王30 分钟前
java并发编程(三)CAS
java·开发语言
油丶酸萝卜别吃37 分钟前
Mapbox GL JS 表达式 (expression) 条件样式设置 完全指南
开发语言·javascript·ecmascript
尤老师FPGA1 小时前
使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第四十五讲)
android·java·ui
爱吃大芒果1 小时前
Flutter for OpenHarmony前置知识:Dart 语法核心知识点总结(下)
开发语言·flutter·dart