4个版本 (2个重大更新)

0.3.0 2024年7月17日
0.2.0 2024年5月19日
0.1.2 2024年3月21日
0.1.1 2024年3月16日
0.1.0 2024年3月16日

#664数据库接口

Download history 119/week @ 2024-05-14 31/week @ 2024-05-21 101/week @ 2024-07-16 27/week @ 2024-07-23 17/week @ 2024-07-30

每月145次下载

MIT 协议

13KB
185

crates.io docs.rs

duckdb-rs-bitstring

duckdb-rs的一个扩展,提供对DuckDB BIT/BITSTRING类型的支持。对应的Rust类型是来自bit-vecBitVec。 (duckdb-bitstring通过将BitVec包装在Bitstring中来提供这种支持。)

兼容性表格

duckdb-bitstring DuckDB bit-vec
0.3 1.0.X 0.6.3
0.2 0.10.X 0.6.3

从DuckDB查询BIT

类似于duckdb-rust中的示例 - 可以从行的.get获取一个Bitstring。可以使用.into_bitvec().as_bitvec()Bitstring转换为底层的BitVec,或者使用.as_bitvec()获取对底层的BitVec的引用而不消耗Bitstring

use bit_vec::BitVec;
use duckdb::{Connection, Result};
use duckdb_bitstring::Bitstring;

fn main() -> Result<()> {
    let conn = Connection::open_in_memory()?;

    conn.execute_batch(
        "CREATE TABLE t1 (d BIT);
        INSERT INTO t1 VALUES ('10110'::BIT);
        INSERT INTO t1 VALUES ('01101100010101101'::BIT);
        INSERT INTO t1 VALUES ('11111111111'::BIT);"
    )?;

    let bitvecs: Vec<Result<BitVec>> = conn.prepare("SELECT d FROM t1")?.query_map([], |row| {
        let value: Bitstring = row.get(0)?;
        Ok(value.into_bitvec())
    })?.collect();

    for bv in bitvecs {
        println!("{:?}", bv?);
    }

    // 10110
    // 01101100010101101
    // 11111111111

    Ok(())
}

将Bitstring作为查询参数提供

使用Bitstring::from(...)将拥有的或借用到的BitVec包装成Bitstring。然后,在duckdb-rs中,如往常一样将Bitstring作为SQL参数传递。在SQL查询中,仍然建议使用::BIT将参数显式转换为BIT。这是因为底层将BitVec必然转换为字符串,尽管DuckDB在许多情况下能够自动将其识别为bitstring,但在所有情况下并不能,因此需要显式转换。

use bit_vec::BitVec;
use duckdb::{params, Connection, Result};
use duckdb_bitstring::Bitstring;

fn main() -> Result<()> {
    let conn = Connection::open_in_memory()?;

    conn.execute(
        "CREATE TABLE t1 (id INT, d BIT);",
        [],
    )?;

    let bv = BitVec::from_iter(vec![true, true, false, false, true]);
    let bs = Bitstring::from(bv);

    conn.execute(
        "INSERT INTO t1 VALUES (?, ?::BIT)",
        params![1, bs],
    )?;


    Ok(())
}

重要:一个 Bitstring(或者更确切地说,其内部的 BitVec)可以是空的(即零位长度),但DuckDB不支持空的BIT。如果您尝试将空的 Bitstring 作为查询参数传递,则 duckdb-bitstring 将会报错。

在Appender中的使用

Bitstring 也可以用作 Appender 的参数

use bit_vec::BitVec;
use duckdb::{params, Connection, Result};
use duckdb_bitstring::Bitstring;

fn main() -> Result<()> {
    let conn = Connection::open_in_memory()?;

    conn.execute(
        "CREATE TABLE t1 (id INT, d BIT);",
        [],
    )?;

    let mut appender = conn.appender("t1")?;

    let bv = BitVec::from_iter(vec![true, true, false, false, true]);
    let bs = Bitstring::from(bv);

    appender.append_row(params![1, bs])?;

    // note: if you want to try querying the `t1` table now,
    // you need to drop `appender` first!

    Ok(())
}

依赖关系

~21–29MB
~324K SLoC