#sqlite #package-manager #embedded-database #embedded-db

sqlite3-builder

无依赖,专为lodpm构建的微型sqlite3包装器

4个稳定版本

3.39.4 2023年6月11日
3.38.7 2022年4月19日
3.38.6 2022年3月30日
3.38.5 2022年3月28日

#274数据库接口

Download history 5/week @ 2024-03-14 52/week @ 2024-03-21 10/week @ 2024-03-28 1/week @ 2024-04-04 2/week @ 2024-04-25

464 每月下载量
用于 min-sqlite3-sys

MIT 许可证

9MB
164K SLoC

C 164K SLoC // 0.3% comments Rust 79 SLoC

专为lod包管理器和Unix系统构建的极简sqlite包装器包。如果您需要完整的sqlite数据库工具箱,请考虑使用rusqlite

将库添加到项目中

在您的Cargo.toml文件中

[dependencies]
min-sqlite3-sys = "1.3"

在您的二进制crate的build.rs文件中

use std::{env, path::Path};

fn main() {
    let home_path = env::var("HOME").expect("HOME environment variable is not set.");
    let target_dir = Path::new(&home_path).join(".local/share/min_sqlite3_sys");

    println!("cargo:rustc-link-arg=-Wl,-rpath={}", target_dir.display());
}

使用方法

简单使用

use std::path::Path;

use min_sqlite3_sys::prelude::*;

fn main() {
    let db = Database::open(Path::new("example.db")).unwrap();
    let statement = String::from(
        "CREATE TABLE IF NOT EXISTS items(
                 id      PRIMARY KEY,
                 name    TEXT,
                 tag     TEXT
             );
         ",
    );

    let status = db.execute(
        statement,
        None::<Box<dyn FnOnce(SqlitePrimaryResult, String)>>,
    ).unwrap();

    if status != SqlitePrimaryResult::Ok {
        // handle the problem
    }

    db.close();
}

使用回调函数的简单使用

use std::path::Path;

use min_sqlite3_sys::prelude::*;

fn callback_function(status: SqlitePrimaryResult, sql_statement: String) {
    println!(
        "{} did not successfully executed. The error status is: {:?}.",
        sql_statement, status
    );
}

fn main() {
    let db = Database::open(Path::new("example.db")).unwrap();
    let statement = String::from(
        "CREATE TABLE IF NOT EXISTS items(
                 id      PRIMARY KEY,
                 name    TEXT,
                 tag     TEXT
             );
         ",
    );

    db.execute(statement, Some(callback_function)).unwrap();

    db.close();
}

使用检索一些数据

#![allow(dead_code)]
use std::path::Path;

use min_sqlite3_sys::prelude::*;

fn callback_function(status: SqlitePrimaryResult, sql_statement: String) {
    println!(
        "{} did not successfully executed. The error status is: {:?}.",
        sql_statement, status
    );
}

#[derive(Debug)]
struct Item {
    id: i64,
    name: String,
    tag: String,
}

fn main() {
    let db = Database::open(Path::new("example.db")).unwrap();
    let statement = String::from("SELECT * FROM items WHERE name = 'Onur';");

    let mut sql = db.prepare(statement, Some(callback_function)).unwrap();

    // Iterate the results
    while let PreparedStatementStatus::FoundRow = sql.execute_prepared() {
        println!(
            "id = {}, name = {}, tag = {}",
            sql.get_data::<i64>(0).unwrap(),
            sql.get_data::<String>(1).unwrap(),
            sql.get_data::<String>(2).unwrap(),
        );

        // Or simply
        println!(
            "{:?}",
            Item {
                id: sql.get_data(0).unwrap(),
                name: sql.get_data(1).unwrap(),
                tag: sql.get_data(2).unwrap(),
            }
        );
    }
    // Must be called for each `prepare()` result.
    sql.kill();

    db.close();
}

使用检索一些数据 + 绑定值

#![allow(dead_code)]
use std::path::Path;

use min_sqlite3_sys::prelude::*;

fn callback_function(status: SqlitePrimaryResult, sql_statement: String) {
    println!(
        "{} did not successfully executed. The error status is: {:?}.",
        sql_statement, status
    );
}

#[derive(Debug)]
struct Item {
    id: i64,
    name: String,
    tag: String,
}

fn main() {
    let db = Database::open(Path::new("example.db")).unwrap();
    let statement = String::from("SELECT * FROM items WHERE name = ?;");

    let mut sql = db.prepare(statement, Some(callback_function)).unwrap();
    let status = sql.bind_val(1, "Onur");
    // You can do some checks by
    assert_eq!(status, SqlitePrimaryResult::Ok);
    // or
    if status == SqlitePrimaryResult::Range {
    	panic!("Out of index on sql.bind_val!");
    }

    // Iterate the results
    while let PreparedStatementStatus::FoundRow = sql.execute_prepared() {
        println!(
            "id = {}, name = {}, tag = {}",
            sql.get_data::<i64>(0).unwrap(),
            sql.get_data::<String>(1).unwrap(),
            sql.get_data::<String>(2).unwrap(),
        );

        // Or simply
        println!(
            "{:?}",
            Item {
                id: sql.get_data(0).unwrap(),
                name: sql.get_data(1).unwrap(),
                tag: sql.get_data(2).unwrap(),
            }
        );
    }
    // Must be called for each `prepare()` result.
    sql.kill();

    db.close();
}

注意

为了不膨胀您项目的构建输出,该库通过FFI使用C ABI从动态库中执行sqlite函数。这意味着您的构建输出将不包含sqlite源代码。

此库不使用您系统上的任何SQLite库,以确保包不受SQLite版本的影响。相反,sqlite3-builder crate将sqlite3源代码编译为动态库,并将其放置在'~/.local/share/min_sqlite3_sys'下。

许可证

本包受MIT许可证的保护。有关更多信息,请参阅LICENSE文件。

无运行时依赖