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 |
|
#664 在 数据库接口
每月145次下载
13KB
185 行
duckdb-rs-bitstring
是duckdb-rs的一个扩展,提供对DuckDB BIT/BITSTRING类型的支持。对应的Rust类型是来自bit-vec
包的BitVec
。 (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