rust调用SQLite实例

发布于:2024-05-07 ⋅ 阅读:(38) ⋅ 点赞:(0)

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