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