#sqlite #sql-database #sql

xext-sql

一个简单易用的 SQLite 数据库操作库,提供了更安全和便捷的 API

1 unstable release

Uses new Rust 2024

0.1.0 Mar 8, 2025

#590 in Database interfaces

Download history 113/week @ 2025-03-05 8/week @ 2025-03-12

121 downloads per month

MIT/Apache

25KB
446 lines

xext-sql

Crates.io Documentation License

一个简单易用的 SQLite 数据库操作库,提供了更安全和便捷的 API。

特性

  • 内存数据库和文件数据库支持
  • 只读模式和内存限制设置
  • 事务处理
  • 便捷的查询和数据转换
  • 表结构信息获取
  • 索引管理和优化
  • 批量数据操作

安装

将以下内容添加到您的 Cargo.toml 文件中:

[dependencies]
xext-sql = "0.1.0"

快速开始

use xext_sql::{Database, DatabaseConfig, FromRow, params};
use anyhow::Result;

// 定义用户结构体
#[derive(Debug)]
struct User {
    id: i32,
    name: String,
    email: Option<String>,
    age: Option<i32>,
}

// 为结构体实现 FromRow 特征
impl<'a> FromRow<'a> for User {
    fn from_row(row: &'a rusqlite::Row) -> Result<Self> {
        Ok(Self {
            id: row.get(0)?,
            name: row.get(1)?,
            email: row.get(2)?,
            age: row.get(3)?,
        })
    }
}

fn main() -> Result<()> {
    // 创建内存数据库
    let config = DatabaseConfig::memory();
    let mut db = Database::new(config)?;
    
    // 创建用户表
    db.execute(
        "CREATE TABLE users (
            id INTEGER PRIMARY KEY,
            name TEXT NOT NULL,
            email TEXT,
            age INTEGER
        )",
        &[],
    )?;
    
    // 插入数据
    db.execute(
        "INSERT INTO users (id, name, email, age) VALUES (?, ?, ?, ?)",
        params![1, "张三", "zhangsan@example.com", 30],
    )?;
    
    // 查询数据
    let user: User = db.query_row(
        "SELECT id, name, email, age FROM users WHERE id = ?",
        params![1],
    )?;
    
    println!("用户: {:?}", user);
    
    Ok(())
}

更多示例

查看 examples 目录获取更多示例。

事务处理

// 开始事务
let tx = db.transaction()?;

// 在事务中执行操作
tx.execute(
    "INSERT INTO users (id, name) VALUES (?, ?)",
    params![2, "李四"],
)?;

// 提交事务
tx.commit()?;

// 或者回滚事务
// tx.rollback()?;

批量插入

use rusqlite::types::ToSql;

// 准备批量插入的数据
let columns = vec!["id", "name", "email"];

let mut values: Vec<Vec<Box<dyn ToSql>>> = Vec::new();
values.push(vec![
    Box::new(3),
    Box::new("王五".to_string()),
    Box::new(Some("wangwu@example.com".to_string())),
]);

// 执行批量插入,每批 10 条数据
db.batch_insert("users", &columns, &values, 10)?;

许可证

本项目采用 MIT 或 Apache-2.0 双许可证。

Dependencies

~22MB
~422K SLoC