第六章:数据库操作与数据管理
第一节:Rust 与 SQLite 的集成
在本节中,我们将深入探讨如何在 Rust 中使用 SQLite 数据库,涵盖从基本的 CRUD 操作到事务处理、数据模型的构建、性能优化以及安全性考虑等方面。SQLite 是一个轻量级的关系型数据库,适合嵌入式应用和小型项目。我们将利用 rusqlite
库高效地与 SQLite 进行交互。
1. 使用 rusqlite 进行基本 CRUD 操作
1.1 rusqlite 库的引入
首先,在 Cargo.toml
文件中添加 rusqlite
依赖:
[dependencies]
rusqlite = { version = "0.26", features = ["bundled"] }
1.2 连接到 SQLite 数据库
use rusqlite::{params, Connection, Result};
fn connect_to_db() -> Result<Connection> {
let conn = Connection::open("my_database.db")?;
Ok(conn)
}
1.3 创建表
在执行任何 CRUD 操作之前,我们需要定义数据表。
fn create_table(conn: &Connection) -> Result<()> {
conn.execute(
"CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER NOT NULL
)",
[],
)?;
Ok(())
}
1.4 插入数据(Create)
我们可以通过以下代码插入数据到表中:
fn insert_user(conn: &Connection, name: &str, age: i32) -> Result<()> {
conn.execute(
"INSERT INTO users (name, age) VALUES (?1, ?2)",
params![name, age],
)?;
Ok(())
}
1.5 查询数据(Read)
查询数据可以使用 query_map
方法:
fn fetch_users(conn: &Connection) -> Result<Vec<(i32, String, i32)>> {
let mut stmt = conn.prepare("SELECT id, name, age FROM users")?;
let user_iter = stmt.query_map([], |row| {
Ok((row.get(0)?, row.get(1)?, row.get(2)?))
})?;
let mut users = Vec::new();
for user in user_iter {
users.push(user?);
}