#rusqlite #async-executor #thread #async-task #async-context #wrapper #tiny

async-rusqlite

对rusqlite的微小、无执行器依赖的包装,使其能够进行异步调用

3个版本 (重大更改)

0.4.0 2023年8月30日
0.3.0 2023年5月7日
0.1.0 2023年5月1日

1346数据库接口

Download history 23/week @ 2024-03-10 4/week @ 2024-03-17 7/week @ 2024-03-24 32/week @ 2024-03-31 23/week @ 2024-04-07 74/week @ 2024-04-14 41/week @ 2024-04-21 130/week @ 2024-04-28 126/week @ 2024-05-05 155/week @ 2024-05-12 3/week @ 2024-05-19 1/week @ 2024-05-26 52/week @ 2024-06-02 6/week @ 2024-06-09 6/week @ 2024-06-16 5/week @ 2024-06-23

每月下载量 69
sqliter 中使用

MIT 协议

18KB
242

async-rusqlite

一个微小、无执行器依赖的库,用于在异步环境中使用 rusqlite。这实际上只是在长生存线程上启动一个 rusqlite 并将闭包发送到该线程以操作它。

此库受 tokio-rusqlite 的启发,但有以下设计差异

  • 无执行器依赖;可以使用 tokioasync-std 或其他任何东西。
  • 有限通道;tokio-rusqlite 使用无限通道将消息发送到 rusqlite 线程。此库使用有限通道以允许在数据库无法跟上调用时将背压传播回异步任务。
  • 依赖项较少;除了 rusqlite 之外,引入的附加依赖项树为 1(《asyncified》,它本身非常小)。

如果你不在乎上面的内容,更喜欢 tokio-rusqlite,它经过了更多实战测试,并依赖于受人尊敬的 crossbeam-channel 而不是我在 asyncified 中的相当天真的通道实现。

use async_rusqlite::Connection;

#[derive(Debug)]
struct Person {
    id: i32,
    name: String,
    data: Option<Vec<u8>>,
}

let conn = Connection::open_in_memory().await?;

conn.call(|conn| {
    conn.execute(
        "CREATE TABLE person (
            id   INTEGER PRIMARY KEY,
            name TEXT NOT NULL,
            data BLOB
        )",
        (),
    )
}).await?;

let me = Person {
    id: 0,
    name: "Steven".to_string(),
    data: None,
};

conn.call(move |conn| {
    conn.execute(
        "INSERT INTO person (name, data) VALUES (?1, ?2)",
        (&me.name, &me.data),
    )
}).await?;

依赖项

~22MB
~423K SLoC