Using sqlite-vec
in Rust ​
You can embed sqlite-vec
into your Rust projects using the official sqlite-vec
crate.
bash
cargo add sqlite-vec
The crate embeds the sqlite-vec
C source code, and uses the cc
crate to compile and statically link sqlite-vec
at build-time.
The sqlite-vec
crate exposes a single function sqlite3_vec_init
, which is the C entrypoint for the SQLite extension. You can "register" with your Rust SQLite library's sqlite3_auto_extension()
function. Here's an example with rusqlite
:
rs
use sqlite_vec::sqlite3_vec_init;
use rusqlite::{ffi::sqlite3_auto_extension, Result};
fn main()-> Result<()> {
unsafe {
sqlite3_auto_extension(Some(std::mem::transmute(sqlite3_vec_init as *const ())));
}
// future database connection will now automatically include sqlite-vec functions!
let db = Connection::open_in_memory()?;
let vec_version: String = db.query_row("select vec_version()", &[v.as_bytes()], |x| x.get(0)?)?;
println!("vec_version={vec_version}");
Ok(())
}
See simple-rust/demo.rs
for a more complete Rust demo.
Working with vectors in Rust ​
If your vectors are provided as a Vec<f32>
type, the zerocopy
crate is recommended, specifically zerocopy::AsBytes
. This will allow you to pass in vectors into sqlite-vec
without any copying.
rs
let query: Vec<f32> = vec![0.1, 0.2, 0.3, 0.4];
let mut stmt = db.prepare("SELECT vec_length(?)")?;
stmt.execute(&[item.1.as_bytes()])?;