Crates.io | ic-rusqlite |
lib.rs | ic-rusqlite |
version | 0.4.3 |
created_at | 2025-08-04 12:12:25.205228+00 |
updated_at | 2025-09-24 12:10:02.713129+00 |
description | The project provides easy-to-use library to enable SQLite in your Internet Computer canister. |
homepage | |
repository | https://github.com/wasm-forge/ic-rusqlite |
max_upload_size | |
id | 1780640 |
size | 2,179,589 |
This is a convenience package to create a canister with the Sqlite support.
It is assumed that you have rust, dfx.
To compile a project with this dependency, you will need to:
install wasi2ic: cargo install wasi2ic
install WASI target: rustup target add wasm32-wasip1
If you don't want to install WASI-SDK
, you can use the precompiled SQLite version for WASI, just activate the precompiled
feature and disable the default features:
cargo add ic-rusqlite --features precompiled
If you intend to compile the SQLite from the source, you will need to install WASI-SDK:
WASI_SDK_PATH
and PATH
variables:export WASI_SDK_PATH=/opt/wasi-sdk
export PATH=$WASI_SDK_PATH/bin:$PATH
You can automate this by launching the preparation script:
curl -fsSL https://raw.githubusercontent.com/wasm-forge/ic-rusqlite/main/prepare.sh | sh
Finally, to enable rusqlite
in your canister, add the helper dependency into your backend canister:
cargo add ic-rusqlite --features compile_sqlite
You will need to update the dfx.json
to specify path to wasm
, set type
to custom
, and
specify custom build steps to enforce compilation to the wasm32-wasip1
target.
Finally, use wasi2ic
to produce wasm executable on the Internet Computer.
Example:
{
"canisters": {
"backend": {
"candid": "can.did",
"package": "backend",
"build": [
"cargo build --release --target wasm32-wasip1",
"wasi2ic target/wasm32-wasip1/release/backend.wasm target/wasm32-wasip1/release/backend_nowasi.wasm"
],
"wasm": "target/wasm32-wasip1/release/backend_nowasi.wasm",
"type": "custom",
"metadata": [
{
"name": "candid:service"
}
]
}
},
"dfx": "0.28.0",
"version": 1
}
Finally, use the with_connection()
function to access your database:
//...
with_connection(|conn| {
conn.execute(
"CREATE TABLE person (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
data BLOB
)",
(),
)?;
let data: Option<Vec<u8>> = None;
conn.execute(
"INSERT INTO person (name, data) VALUES (?1, ?2)",
("Steven", &data),
)?;
})
//...
You can find a small example in the "examples/backend"
folder.
For more detailed explanations, see the ic-rusqlite
book.