Rust 语言使用 SQLite 数据库

SQLite 是一种广泛使用的轻量级数据库,它通过简单的文件来承载数据,无需复杂的服务器配置。正因如此,它成为了许多桌面和移动应用的首选数据库。在 Rust 生态中,rusqlite 库为开发者提供了操作 SQLite 数据库的简洁且有效的方法。本文将全面介绍如何利用 rusqlite 在 Rust 中进行数据库操作。

起步安装

在开始之前,我们需要将 rusqlite 引入到你的 Rust 项目中。首先,在项目的 Cargo.toml 文件下的 [dependencies] 部分添加 rusqlite

toml 复制代码
[dependencies]
rusqlite = "0.25.3"

完成添加后,执行 cargo build 来下载和编译 rusqlite 库及其依赖。

打开和创建数据库

要操作一个 SQLite 数据库,首先需要创建一个连接。rusqlite 提供了 Connection 对象来实现这一点。以下示例展示如何打开一个存在的数据库文件或创建一个新的数据库文件:

rust 复制代码
use rusqlite::{Connection, Result};

fn main() -> Result<()> {
    let conn = Connection::open("my_database.db")?;

    // 接下来,你可以使用 `conn` 来进行数据库操作
    // ...

    Ok(())
}

创建表

有了 Connection 对象,我们就可以开始创建数据表:

rust 复制代码
use rusqlite::{params, Connection, Result};

fn main() -> Result<()> {
    let conn = Connection::open("my_database.db")?;

    conn.execute(
        "CREATE TABLE if not exists person (
            id INTEGER PRIMARY KEY,
            name TEXT NOT NULL,
            age INTEGER
         )",
        params![],
    )?;

    Ok(())
}

在上述代码中,我们创建了一个简单的 person 表,包含 idnameage 三个字段。

插入数据

插入数据是数据库操作的基础。在 rusqlite 中,插入数据可以通过 execute 方法实现:

rust 复制代码
fn main() -> Result<()> {
    let conn = Connection::open("my_database.db")?;

    conn.execute(
        "INSERT INTO person (name, age) VALUES (?1, ?2)",
        params!["Alice", 32],
    )?;
    
    Ok(())
}

查询数据

查询数据可以通过 query_map 方法来进行,它允许我们映射查询结果到 Rust 的结构体中:

rust 复制代码
use rusqlite::{params, Connection, Result, NO_PARAMS};

#[derive(Debug)]
struct Person {
    id: i32,
    name: String,
    age: i32,
}

fn main() -> Result<()> {
    let conn = Connection::open("my_database.db")?;

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

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

    Ok(())
}

更新和删除数据

数据的更新和删除也是通过 execute 方法来完成的。下面展示如何对数据进行更新和删除:

rust 复制代码
fn main() -> Result<()> {
    let conn = Connection::open("my_database.db")?;

    // 更新数据
    conn.execute(
        "UPDATE person SET age = ? WHERE id = ?",
        params![60, 1],
    )?;

    // 删除数据
    conn.execute(
        "DELETE FROM person WHERE id = ?",
        params![1],
    )?;

    Ok(())
}

事务处理

使用 rusqlite 进行事务处理可以确保数据的一致性和完整性。transaction 方法可以用来包裹一系列数据库操作,确保它们要么全部成功,要么全部失败无效。下面的示例展示了如何使用事务:

rust 复制代码
use rusqlite::Connection;

fn main() {
    let conn = Connection::open("my_database.db").unwrap();
    
    // 开启事务
    let tx = conn.transaction().unwrap();

    // 执行一系列数据库操作
    tx.execute("INSERT INTO person (name, age) VALUES (?1, ?2)", &["Bob", 45]).unwrap();
    tx.execute("UPDATE person SET age = age + 1 WHERE name = ?1", &["Alice"]).unwrap();

    // 如果所有操作都成功,提交事务
    tx.commit().unwrap();
}

结束语

rusqlite 是 Rust 中操作 SQLite 数据库的一个强大工具,它通过安全且符合 Rust 风格的接口,极大程度地简化了数据库的操作。应用 rusqlite,你可以专注于业务逻辑的构建,而不必担心底层 SQL 的繁琐。通过本文的介绍,我希望你能够对如何使用 rusqlite 有个清晰的认识,并能够在你自己的项目中愉快地使用它。

相关推荐
SomeB1oody1 天前
【Rust自学】4.1. 所有权:栈内存 vs. 堆内存
开发语言·后端·rust
SomeB1oody2 天前
【Rust自学】4.2. 所有权规则、内存与分配
开发语言·后端·rust
SomeB1oody2 天前
【Rust自学】4.5. 切片(Slice)
开发语言·后端·rust
编码浪子2 天前
构建一个rust生产应用读书笔记6-拒绝无效订阅者02
开发语言·后端·rust
baiyu332 天前
1小时放弃Rust(1): Hello-World
rust
baiyu332 天前
1小时放弃Rust(2): 两数之和
rust
Source.Liu2 天前
数据特性库 前言
rust·cad·num-traits
编码浪子2 天前
构建一个rust生产应用读书笔记7-确认邮件1
数据库·rust·php
SomeB1oody2 天前
【Rust自学】3.6. 控制流:循环
开发语言·后端·rust
Andrew_Ryan2 天前
深入了解 Rust 核心开发团队:这些人如何塑造了世界上最安全的编程语言
rust