1# Rusqlite 2 3[](https://crates.io/crates/rusqlite) 4[](https://docs.rs/rusqlite) 5[](https://github.com/rusqlite/rusqlite/actions) 6[](https://ci.appveyor.com/project/rusqlite/rusqlite) 7[](https://codecov.io/gh/rusqlite/rusqlite) 8[](https://deps.rs/repo/github/rusqlite/rusqlite) 9[](https://discord.gg/nFYfGPB8g4) 10 11Rusqlite is an ergonomic wrapper for using SQLite from Rust. 12 13Historically, the API was based on the one from [`rust-postgres`](https://github.com/sfackler/rust-postgres). However, the two have diverged in many ways, and no compatibility between the two is intended. 14 15## Usage 16 17In your Cargo.toml: 18 19```toml 20[dependencies] 21# `bundled` causes us to automatically compile and link in an up to date 22# version of SQLite for you. This avoids many common build issues, and 23# avoids depending on the version of SQLite on the users system (or your 24# system), which may be old or missing. It's the right choice for most 25# programs that control their own SQLite databases. 26# 27# That said, it's not ideal for all scenarios and in particular, generic 28# libraries built around `rusqlite` should probably not enable it, which 29# is why it is not a default feature -- it could become hard to disable. 30rusqlite = { version = "0.32.0", features = ["bundled"] } 31``` 32 33Simple example usage: 34 35```rust 36use rusqlite::{Connection, Result}; 37 38#[derive(Debug)] 39struct Person { 40 id: i32, 41 name: String, 42 data: Option<Vec<u8>>, 43} 44 45fn main() -> Result<()> { 46 let conn = Connection::open_in_memory()?; 47 48 conn.execute( 49 "CREATE TABLE person ( 50 id INTEGER PRIMARY KEY, 51 name TEXT NOT NULL, 52 data BLOB 53 )", 54 (), // empty list of parameters. 55 )?; 56 let me = Person { 57 id: 0, 58 name: "Steven".to_string(), 59 data: None, 60 }; 61 conn.execute( 62 "INSERT INTO person (name, data) VALUES (?1, ?2)", 63 (&me.name, &me.data), 64 )?; 65 66 let mut stmt = conn.prepare("SELECT id, name, data FROM person")?; 67 let person_iter = stmt.query_map([], |row| { 68 Ok(Person { 69 id: row.get(0)?, 70 name: row.get(1)?, 71 data: row.get(2)?, 72 }) 73 })?; 74 75 for person in person_iter { 76 println!("Found person {:?}", person.unwrap()); 77 } 78 Ok(()) 79} 80``` 81 82### Supported SQLite Versions 83 84The base `rusqlite` package supports SQLite version 3.14.0 or newer. If you need 85support for older versions, please file an issue. Some cargo features require a 86newer SQLite version; see details below. 87 88### Optional Features 89 90Rusqlite provides several features that are behind [Cargo 91features](https://doc.rust-lang.org/cargo/reference/manifest.html#the-features-section). They are: 92 93* [`load_extension`](https://docs.rs/rusqlite/~0/rusqlite/struct.LoadExtensionGuard.html) 94 allows loading dynamic library-based SQLite extensions. 95* `loadable_extension` to program [loadable extension](https://sqlite.org/loadext.html) in Rust. 96* [`backup`](https://docs.rs/rusqlite/~0/rusqlite/backup/index.html) 97 allows use of SQLite's online backup API. 98* [`functions`](https://docs.rs/rusqlite/~0/rusqlite/functions/index.html) 99 allows you to load Rust closures into SQLite connections for use in queries. 100* `window` for [window function](https://www.sqlite.org/windowfunctions.html) support (`fun(...) OVER ...`). (Implies `functions`.) 101* [`trace`](https://docs.rs/rusqlite/~0/rusqlite/trace/index.html) 102 allows hooks into SQLite's tracing and profiling APIs. 103* [`blob`](https://docs.rs/rusqlite/~0/rusqlite/blob/index.html) 104 gives `std::io::{Read, Write, Seek}` access to SQL BLOBs. 105* [`limits`](https://docs.rs/rusqlite/~0/rusqlite/struct.Connection.html#method.limit) 106 allows you to set and retrieve SQLite's per connection limits. 107* `chrono` implements [`FromSql`](https://docs.rs/rusqlite/~0/rusqlite/types/trait.FromSql.html) 108 and [`ToSql`](https://docs.rs/rusqlite/~0/rusqlite/types/trait.ToSql.html) for various 109 types from the [`chrono` crate](https://crates.io/crates/chrono). 110* `serde_json` implements [`FromSql`](https://docs.rs/rusqlite/~0/rusqlite/types/trait.FromSql.html) 111 and [`ToSql`](https://docs.rs/rusqlite/~0/rusqlite/types/trait.ToSql.html) for the 112 `Value` type from the [`serde_json` crate](https://crates.io/crates/serde_json). 113* `time` implements [`FromSql`](https://docs.rs/rusqlite/~0/rusqlite/types/trait.FromSql.html) 114 and [`ToSql`](https://docs.rs/rusqlite/~0/rusqlite/types/trait.ToSql.html) for various 115 types from the [`time` crate](https://crates.io/crates/time). 116* `url` implements [`FromSql`](https://docs.rs/rusqlite/~0/rusqlite/types/trait.FromSql.html) 117 and [`ToSql`](https://docs.rs/rusqlite/~0/rusqlite/types/trait.ToSql.html) for the 118 `Url` type from the [`url` crate](https://crates.io/crates/url). 119* `bundled` uses a bundled version of SQLite. This is a good option for cases where linking to SQLite is complicated, such as Windows. 120* `sqlcipher` looks for the SQLCipher library to link against instead of SQLite. This feature overrides `bundled`. 121* `bundled-sqlcipher` uses a bundled version of SQLCipher. This searches for and links against a system-installed crypto library to provide the crypto implementation. 122* `bundled-sqlcipher-vendored-openssl` allows using bundled-sqlcipher with a vendored version of OpenSSL (via the `openssl-sys` crate) as the crypto provider. 123 - As the name implies this depends on the `bundled-sqlcipher` feature, and automatically turns it on. 124 - If turned on, this uses the [`openssl-sys`](https://crates.io/crates/openssl-sys) crate, with the `vendored` feature enabled in order to build and bundle the OpenSSL crypto library. 125* `hooks` for [Commit, Rollback](http://sqlite.org/c3ref/commit_hook.html) and [Data Change](http://sqlite.org/c3ref/update_hook.html) notification callbacks. 126* `preupdate_hook` for [preupdate](https://sqlite.org/c3ref/preupdate_count.html) notification callbacks. (Implies `hooks`.) 127* `unlock_notify` for [Unlock](https://sqlite.org/unlock_notify.html) notification. 128* `vtab` for [virtual table](https://sqlite.org/vtab.html) support (allows you to write virtual table implementations in Rust). Currently, only read-only virtual tables are supported. 129* `series` exposes [`generate_series(...)`](https://www.sqlite.org/series.html) Table-Valued Function. (Implies `vtab`.) 130* [`csvtab`](https://sqlite.org/csv.html), CSV virtual table written in Rust. (Implies `vtab`.) 131* [`array`](https://sqlite.org/carray.html), The `rarray()` Table-Valued Function. (Implies `vtab`.) 132* `i128_blob` allows storing values of type `i128` type in SQLite databases. Internally, the data is stored as a 16 byte big-endian blob, with the most significant bit flipped, which allows ordering and comparison between different blobs storing i128s to work as expected. 133* `uuid` allows storing and retrieving `Uuid` values from the [`uuid`](https://docs.rs/uuid/) crate using blobs. 134* [`session`](https://sqlite.org/sessionintro.html), Session module extension. Requires `buildtime_bindgen` feature. (Implies `hooks`.) 135* `extra_check` fail when a query passed to execute is readonly or has a column count > 0. 136* `column_decltype` provides `columns()` method for Statements and Rows; omit if linking to a version of SQLite/SQLCipher compiled with `-DSQLITE_OMIT_DECLTYPE`. 137* `collation` exposes [`sqlite3_create_collation_v2`](https://sqlite.org/c3ref/create_collation.html). 138* `serialize` exposes [`sqlite3_serialize`](http://sqlite.org/c3ref/serialize.html) (3.23.0). 139 140## Notes on building rusqlite and libsqlite3-sys 141 142`libsqlite3-sys` is a separate crate from `rusqlite` that provides the Rust 143declarations for SQLite's C API. By default, `libsqlite3-sys` attempts to find a SQLite library that already exists on your system using pkg-config, or a 144[Vcpkg](https://github.com/Microsoft/vcpkg) installation for MSVC ABI builds. 145 146You can adjust this behavior in a number of ways: 147 148* If you use the `bundled`, `bundled-sqlcipher`, or `bundled-sqlcipher-vendored-openssl` features, `libsqlite3-sys` will use the 149 [cc](https://crates.io/crates/cc) crate to compile SQLite or SQLCipher from source and 150 link against that. This source is embedded in the `libsqlite3-sys` crate and 151 is currently SQLite 3.46.0 (as of `rusqlite` 0.32.0 / `libsqlite3-sys` 152 0.30.0). This is probably the simplest solution to any build problems. You can enable this by adding the following in your `Cargo.toml` file: 153 ```toml 154 [dependencies.rusqlite] 155 version = "0.32.0" 156 features = ["bundled"] 157 ``` 158* When using any of the `bundled` features, the build script will honor `SQLITE_MAX_VARIABLE_NUMBER` and `SQLITE_MAX_EXPR_DEPTH` variables. It will also honor a `LIBSQLITE3_FLAGS` variable, which can have a format like `"-USQLITE_ALPHA -DSQLITE_BETA SQLITE_GAMMA ..."`. That would disable the `SQLITE_ALPHA` flag, and set the `SQLITE_BETA` and `SQLITE_GAMMA` flags. (The initial `-D` can be omitted, as on the last one.) 159* When using `bundled-sqlcipher` (and not also using `bundled-sqlcipher-vendored-openssl`), `libsqlite3-sys` will need to 160 link against crypto libraries on the system. If the build script can find a `libcrypto` from OpenSSL or LibreSSL (it will consult `OPENSSL_LIB_DIR`/`OPENSSL_INCLUDE_DIR` and `OPENSSL_DIR` environment variables), it will use that. If building on and for Macs, and none of those variables are set, it will use the system's SecurityFramework instead. 161 162* When linking against a SQLite (or SQLCipher) library already on the system (so *not* using any of the `bundled` features), you can set the `SQLITE3_LIB_DIR` (or `SQLCIPHER_LIB_DIR`) environment variable to point to a directory containing the library. You can also set the `SQLITE3_INCLUDE_DIR` (or `SQLCIPHER_INCLUDE_DIR`) variable to point to the directory containing `sqlite3.h`. 163* Installing the sqlite3 development packages will usually be all that is required, but 164 the build helpers for [pkg-config](https://github.com/alexcrichton/pkg-config-rs) 165 and [vcpkg](https://github.com/mcgoo/vcpkg-rs) have some additional configuration 166 options. The default when using vcpkg is to dynamically link, 167 which must be enabled by setting `VCPKGRS_DYNAMIC=1` environment variable before build. 168 `vcpkg install sqlite3:x64-windows` will install the required library. 169* When linking against a SQLite (or SQLCipher) library already on the system, you can set the `SQLITE3_STATIC` (or `SQLCIPHER_STATIC`) environment variable to 1 to request that the library be statically instead of dynamically linked. 170 171 172### Binding generation 173 174We use [bindgen](https://crates.io/crates/bindgen) to generate the Rust 175declarations from SQLite's C header file. `bindgen` 176[recommends](https://github.com/servo/rust-bindgen#library-usage-with-buildrs) 177running this as part of the build process of libraries that used this. We tried 178this briefly (`rusqlite` 0.10.0, specifically), but it had some annoyances: 179 180* The build time for `libsqlite3-sys` (and therefore `rusqlite`) increased 181 dramatically. 182* Running `bindgen` requires a relatively-recent version of Clang, which many 183 systems do not have installed by default. 184* Running `bindgen` also requires the SQLite header file to be present. 185 186As of `rusqlite` 0.10.1, we avoid running `bindgen` at build-time by shipping 187pregenerated bindings for several versions of SQLite. When compiling 188`rusqlite`, we use your selected Cargo features to pick the bindings for the 189minimum SQLite version that supports your chosen features. If you are using 190`libsqlite3-sys` directly, you can use the same features to choose which 191pregenerated bindings are chosen: 192 193* `min_sqlite_version_3_14_0` - SQLite 3.14.0 bindings (this is the default) 194 195If you use any of the `bundled` features, you will get pregenerated bindings for the 196bundled version of SQLite/SQLCipher. If you need other specific pregenerated binding 197versions, please file an issue. If you want to run `bindgen` at buildtime to 198produce your own bindings, use the `buildtime_bindgen` Cargo feature. 199 200If you enable the `modern_sqlite` feature, we'll use the bindings we would have 201included with the bundled build. You generally should have `buildtime_bindgen` 202enabled if you turn this on, as otherwise you'll need to keep the version of 203SQLite you link with in sync with what rusqlite would have bundled, (usually the 204most recent release of SQLite). Failing to do this will cause a runtime error. 205 206## Contributing 207 208Rusqlite has many features, and many of them impact the build configuration in 209incompatible ways. This is unfortunate, and makes testing changes hard. 210 211To help here: you generally should ensure that you run tests/lint for 212`--features bundled`, and `--features "bundled-full session buildtime_bindgen"`. 213 214If running bindgen is problematic for you, `--features bundled-full` enables 215bundled and all features which don't require binding generation, and can be used 216instead. 217 218### Checklist 219 220- Run `cargo fmt` to ensure your Rust code is correctly formatted. 221- Ensure `cargo clippy --workspace --features bundled` passes without warnings. 222- Ensure `cargo clippy --workspace --features "bundled-full session buildtime_bindgen"` passes without warnings. 223- Ensure `cargo test --workspace --features bundled` reports no failures. 224- Ensure `cargo test --workspace --features "bundled-full session buildtime_bindgen"` reports no failures. 225 226## Author 227 228Rusqlite is the product of hard work by a number of people. A list is available 229here: https://github.com/rusqlite/rusqlite/graphs/contributors 230 231## Community 232 233Feel free to join the [Rusqlite Discord Server](https://discord.gg/nFYfGPB8g4) to discuss or get help with `rusqlite` or `libsqlite3-sys`. 234 235## License 236 237Rusqlite and libsqlite3-sys are available under the MIT license. See the LICENSE file for more info. 238 239### Licenses of Bundled Software 240 241Depending on the set of enabled cargo `features`, rusqlite and libsqlite3-sys will also bundle other libraries, which have their own licensing terms: 242 243- If `--features=bundled-sqlcipher` is enabled, the vendored source of [SQLcipher](https://github.com/sqlcipher/sqlcipher) will be compiled and statically linked in. SQLcipher is distributed under a BSD-style license, as described [here](libsqlite3-sys/sqlcipher/LICENSE). 244 245- If `--features=bundled` is enabled, the vendored source of SQLite will be compiled and linked in. SQLite is in the public domain, as described [here](https://www.sqlite.org/copyright.html). 246 247Both of these are quite permissive, have no bearing on the license of the code in `rusqlite` or `libsqlite3-sys` themselves, and can be entirely ignored if you do not use the feature in question. 248