Rust 连接 SQLite 数据库全流程解析:从环境配置到代码实战

Felix
Felix
发布时间:2026-10-16| 7人浏览过
原创

本文将详细介绍如何使用 Rust 语言结合 rusqlite 库连接和操作 SQLite 数据库。通过完整的代码示例,涵盖环境搭建、CRUD(增删改查)核心函数的编写以及数据的打印输出,帮助开发者快速掌握在 Rust 中进行轻量级数据库交互的方法。

Rust 环境准备与依赖配置

要使用 Rust 操作 SQLite 数据库,首先需要创建一个 Rust 项目并添加必要的依赖库。推荐使用业界标准的 rusqlite crate,它提供了对 SQLite 的安全且高效的绑定。

在终端中,你可以使用 cargo new 命令创建一个新的项目,随后在项目的 Cargo.toml 文件中添加 rusqlite 依赖:

[dependencies]
rusqlite = "0.28" # 请以最新稳定版为准

上述操作完成后,cargo build 或 cargo run 时 Cargo 会自动下载并编译所需的 SQLite C 库绑定。我们将把后续的所有业务逻辑代码统一写在 src/main.rs 文件中。

数据结构定义

为了方便地将数据库表中的行映射为 Rust 结构体,我们需要定义一个 Person 结构体。虽然本例中 Person 有三个字段,但在初始演示中可能仅使用前两个字段进行简单操作。

use rusqlite::{Connection, Result};
use serde::{Serialize, Deserialize};

#[derive(Debug, Serialize, Deserialize)]
struct Person {
    id: i32,
    name: String,
    data: Option, // 可选字段,用于扩展性
}

这里使用 serde 的派生宏是为了方便后续的序列化演示(视具体需求可省略),id 对应主键,name 为用户名,data 作为预留字段。在实际操作中,我们主要关注前两个字段的读写。

建立数据库连接与建表

接下来,编写一个核心的初始化函数,用于创建数据库文件或连接到现有文件,并确保表结构存在。SQLite 是服务器-less 的,因此连接即意味着打开一个 .db 文件。

fn create_db() -> Result<Connection> {
    // 如果文件不存在则创建,存在则直接打开
    let conn = Connection::open("data.db")?;
    
    // 删除旧表以重置环境(生产环境请谨慎使用 DROP TABLE)
    conn.execute_drop_table(false, "person")?;
    
    // 创建 person 表
    conn.execute(
        "CREATE TABLE person (
            id INTEGER PRIMARY KEY NOT NULL,
            name TEXT NOT NULL,
            data TEXT
        )",
        [],
    )?;
    
    Ok(conn)
}

该函数首先通过 Connection::open 尝试打开当前目录下的 data.db。随后,它执行 SQL 语句删除可能存在的旧 person 表并重新创建,最后返回 Connection 对象供后续调用。注意:execute_drop_table 在生产环境中应替换为更安全的 CREATE TABLE IF NOT EXISTS 逻辑,但为了演示清晰,此处采用重置方式。

数据插入操作

连接建立后,我们可以向表中插入数据。以下函数接收数据库连接引用的参数,演示如何安全地插入记录。

fn insert_data(conn: &Connection) -> Result<()> {
    conn.execute(
        "INSERT INTO person (id, name, data) VALUES (?1, ?2, ?3)",
        params![1, "Alice", Some("Hello")],
    )?;
    
    conn.execute(
        "INSERT INTO person (id, name, data) VALUES (?1, ?2, ?3)",
        params![2, "Bob", None],
    )?;
    
    Ok(())
}

这里使用了 execute 方法配合 ?1, ?2 占位符,这是防止 SQL 注入的最佳实践。params! 宏用于传递参数列表。我们插入了两条测试数据:Alice 和 Bob。

数据查询与读取

插入数据后,需要编写查询函数将数据读回内存。我们将查询结果映射为之前定义的 Person 结构体向量。

fn get_data(conn: &Connection) -> Result<Vec<Person>> {
    let mut stmt = conn.prepare("SELECT id, name, data FROM person")?;
    
    let persons_iter = stmt.query_map([], |row| {
        Ok(Person {
            id: row.get(0)?,
            name: row.get(1)?,
            data: row.get(2)?,
        })
    })?;
    
    let mut persons = Vec::new();
    for person_result in persons_iter {
        persons.push(person_result?);
    }
    
    Ok(persons)
}

query_map 方法允许我们将每一行的结果转换为特定的 Rust 类型。如果映射出错,迭代器会抛出错误。最终收集到一个 Vec<Person> 中返回。

主函数整合与运行结果

最后,在 main 函数中串联上述步骤:创建连接、插入数据、查询数据并打印验证。

fn main() -> Result<()> {
    println!("开始连接数据库...");
    let conn = create_db()?;
    
    println!("插入数据...");
    insert_data(&conn)?;
    
    println!("查询数据...");
    let persons = get_data(&conn)?;
    
    for p in persons {
        println!("Person: {:?}", p);
    }
    
    Ok(())
}

运行程序后,终端将依次打印日志信息及读取到的 Person 结构体内容,证明数据已成功写入并读回。

以上就是Rust 连接 SQLite 数据库的详细过程与代码解析,更多关于 Rust 数据库操作的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。