mirror of
https://github.com/asg017/sqlite-vec.git
synced 2026-04-25 16:56:27 +02:00
1.7 KiB
1.7 KiB
Using sqlite-vec in Rust
You can embed sqlite-vec into your Rust projects using the official
sqlite-vec crate.
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:
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(())
}
A full sqlite-vec Rust demo is also available.
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.
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()])?;