2014-11-05 00:32:06 +08:00
# Rusqlite
2016-02-02 03:19:51 +08:00
[![Travis Build Status ](https://api.travis-ci.org/jgallagher/rusqlite.svg?branch=master )](https://travis-ci.org/jgallagher/rusqlite)
2018-02-13 01:37:03 +08:00
[![AppVeyor Build Status ](https://ci.appveyor.com/api/projects/status/github/jgallagher/rusqlite?branch=master&svg=true )](https://ci.appveyor.com/project/jgallagher/rusqlite)
2020-02-19 03:50:28 +08:00
[![Build Status ](https://github.com/jgallagher/rusqlite/workflows/CI/badge.svg )](https://github.com/jgallagher/rusqlite/actions)
2018-02-13 01:37:03 +08:00
[![dependency status ](https://deps.rs/repo/github/jgallagher/rusqlite/status.svg )](https://deps.rs/repo/github/jgallagher/rusqlite)
[![Latest Version ](https://img.shields.io/crates/v/rusqlite.svg )](https://crates.io/crates/rusqlite)
2018-08-11 23:50:16 +08:00
[![Docs ](https://docs.rs/rusqlite/badge.svg )](https://docs.rs/rusqlite)
2014-11-05 01:48:33 +08:00
2014-11-11 01:56:32 +08:00
Rusqlite is an ergonomic wrapper for using SQLite from Rust. It attempts to expose
2018-08-11 23:50:16 +08:00
an interface similar to [rust-postgres ](https://github.com/sfackler/rust-postgres ).
2014-11-05 00:32:06 +08:00
```rust
2019-11-02 01:27:56 +08:00
use rusqlite::{params, Connection, Result};
2014-11-05 00:32:06 +08:00
use time::Timespec;
2015-02-04 07:59:58 +08:00
#[derive(Debug)]
2014-11-05 00:32:06 +08:00
struct Person {
id: i32,
name: String,
time_created: Timespec,
2018-10-24 18:22:54 +08:00
data: Option< Vec < u8 > >,
2014-11-05 00:32:06 +08:00
}
2019-02-09 14:16:05 +08:00
fn main() -> Result< ()> {
let conn = Connection::open_in_memory()?;
2014-11-05 00:32:06 +08:00
2018-10-24 18:22:54 +08:00
conn.execute(
"CREATE TABLE person (
2014-11-05 00:32:06 +08:00
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
time_created TEXT NOT NULL,
data BLOB
2018-10-24 18:22:54 +08:00
)",
2019-11-02 01:27:56 +08:00
params![],
2019-02-09 14:16:05 +08:00
)?;
2014-11-05 00:32:06 +08:00
let me = Person {
id: 0,
name: "Steven".to_string(),
time_created: time::get_time(),
2018-10-24 18:22:54 +08:00
data: None,
2014-11-05 00:32:06 +08:00
};
2018-10-24 18:22:54 +08:00
conn.execute(
"INSERT INTO person (name, time_created, data)
2016-07-02 16:22:47 +08:00
VALUES (?1, ?2, ?3)",
2019-11-02 01:27:56 +08:00
params![me.name, me.time_created, me.data],
2019-02-09 14:16:05 +08:00
)?;
2014-11-05 00:32:06 +08:00
2019-11-02 01:27:56 +08:00
let mut stmt = conn.prepare("SELECT id, name, time_created, data FROM person")?;
let person_iter = stmt.query_map(params![], |row| {
Ok(Person {
2019-02-22 03:48:09 +08:00
id: row.get(0)?,
name: row.get(1)?,
time_created: row.get(2)?,
data: row.get(3)?,
2019-11-02 01:27:56 +08:00
})
})?;
2015-05-07 21:36:29 +08:00
for person in person_iter {
println!("Found person {:?}", person.unwrap());
2014-11-05 00:32:06 +08:00
}
2019-02-09 14:16:05 +08:00
Ok(())
2014-11-05 00:32:06 +08:00
}
```
2017-02-10 09:12:24 +08:00
### Supported SQLite Versions
The base `rusqlite` package supports SQLite version 3.6.8 or newer. If you need
support for older versions, please file an issue. Some cargo features require a
newer SQLite version; see details below.
2015-12-13 05:04:11 +08:00
### Optional Features
Rusqlite provides several features that are behind [Cargo
2018-07-01 03:28:24 +08:00
features](https://doc.rust-lang.org/cargo/reference/manifest.html#the-features-section). They are:
2015-12-13 05:04:11 +08:00
2019-03-10 21:21:29 +08:00
* [`load_extension` ](https://docs.rs/rusqlite/~0/rusqlite/struct.LoadExtensionGuard.html )
2015-12-13 05:04:11 +08:00
allows loading dynamic library-based SQLite extensions.
2019-03-10 21:21:29 +08:00
* [`backup` ](https://docs.rs/rusqlite/~0/rusqlite/backup/index.html )
2017-02-10 09:12:24 +08:00
allows use of SQLite's online backup API. Note: This feature requires SQLite 3.6.11 or later.
2019-03-10 21:21:29 +08:00
* [`functions` ](https://docs.rs/rusqlite/~0/rusqlite/functions/index.html )
2015-12-13 05:04:11 +08:00
allows you to load Rust closures into SQLite connections for use in queries.
2017-02-09 10:41:34 +08:00
Note: This feature requires SQLite 3.7.3 or later.
2019-03-10 21:21:29 +08:00
* [`trace` ](https://docs.rs/rusqlite/~0/rusqlite/trace/index.html )
2017-02-10 09:12:24 +08:00
allows hooks into SQLite's tracing and profiling APIs. Note: This feature
requires SQLite 3.6.23 or later.
2019-03-10 21:21:29 +08:00
* [`blob` ](https://docs.rs/rusqlite/~0/rusqlite/blob/index.html )
2017-02-08 11:10:31 +08:00
gives `std::io::{Read, Write, Seek}` access to SQL BLOBs. Note: This feature
requires SQLite 3.7.4 or later.
2019-03-10 21:21:29 +08:00
* [`limits` ](https://docs.rs/rusqlite/~0/rusqlite/struct.Connection.html#method.limit )
2017-02-08 08:47:59 +08:00
allows you to set and retrieve SQLite's per connection limits.
2019-03-10 21:21:29 +08:00
* `chrono` implements [`FromSql` ](https://docs.rs/rusqlite/~0/rusqlite/types/trait.FromSql.html )
and [`ToSql` ](https://docs.rs/rusqlite/~0/rusqlite/types/trait.ToSql.html ) for various
2016-05-20 09:20:58 +08:00
types from the [`chrono` crate ](https://crates.io/crates/chrono ).
2019-03-10 21:21:29 +08:00
* `serde_json` implements [`FromSql` ](https://docs.rs/rusqlite/~0/rusqlite/types/trait.FromSql.html )
and [`ToSql` ](https://docs.rs/rusqlite/~0/rusqlite/types/trait.ToSql.html ) for the
2016-05-20 09:20:58 +08:00
`Value` type from the [`serde_json` crate ](https://crates.io/crates/serde_json ).
2019-03-10 21:21:29 +08:00
* `url` implements [`FromSql` ](https://docs.rs/rusqlite/~0/rusqlite/types/trait.FromSql.html )
and [`ToSql` ](https://docs.rs/rusqlite/~0/rusqlite/types/trait.ToSql.html ) for the
2019-03-10 11:16:37 +08:00
`Url` type from the [`url` crate ](https://crates.io/crates/url ).
2016-12-31 14:05:54 +08:00
* `bundled` uses a bundled version of sqlite3. This is a good option for cases where linking to sqlite3 is complicated, such as Windows.
2017-11-14 06:59:56 +08:00
* `sqlcipher` looks for the SQLCipher library to link against instead of SQLite. This feature is mutually exclusive with `bundled` .
2018-08-11 20:25:10 +08:00
* `hooks` for [Commit, Rollback ](http://sqlite.org/c3ref/commit_hook.html ) and [Data Change ](http://sqlite.org/c3ref/update_hook.html ) notification callbacks.
* `unlock_notify` for [Unlock ](https://sqlite.org/unlock_notify.html ) notification.
2018-08-11 23:50:16 +08:00
* `vtab` for [virtual table ](https://sqlite.org/vtab.html ) support (allows you to write virtual table implemntations in Rust). Currently, only read-only virtual tables are supported.
2018-08-11 20:25:10 +08:00
* [`csvtab` ](https://sqlite.org/csv.html ), CSV virtual table written in Rust.
* [`array` ](https://sqlite.org/carray.html ), The `rarray()` Table-Valued Function.
Add a feature for storing i128 as blobs.
This is behind the `i128_blob` feature.
Blobs are stored as 16 byte big-endian values, with their most significant bit
flipped. This is so that sorting, comparison, etc all work properly, even with
negative numbers. This also allows the representation to be stable across
different computers.
It's possible that the `FromSql` implementation should handle the case that the
real value is stored in an integer. I didn't do this, but would be willing to
make the change. I don't think we should store them this way though, since I
don't think users would be able to sort/compare them sanely.
Support for `u128` is not implemented, as comparison with i128 values would work
strangely. This also is consistent with `u64` not being allowed, not that I
think that would be reason enough on it's own.
The `byteorder` crate is used if this feature is flipped, as it's quite small
and implements things more or less optimally. If/when `i128::{to,from}_be_bytes`
gets stabilized (https://github.com/rust-lang/rust/issues/52963), we should
probably use that instead.
2018-10-09 03:04:07 +08:00
* `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.
2019-04-11 08:04:39 +08:00
* `uuid` allows storing and retrieving `Uuid` values from the [`uuid` ](https://docs.rs/uuid/ ) crate using blobs.
2019-01-13 19:46:19 +08:00
* [`session` ](https://sqlite.org/sessionintro.html ), Session module extension.
2015-12-13 05:04:11 +08:00
2017-03-04 04:37:15 +08:00
## Notes on building rusqlite and libsqlite3-sys
`libsqlite3-sys` is a separate crate from `rusqlite` that provides the Rust
2017-05-30 02:58:27 +08:00
declarations 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
[Vcpkg ](https://github.com/Microsoft/vcpkg ) installation for MSVC ABI builds.
You can adjust this behavior in a number of ways:
2017-03-04 04:37:15 +08:00
* If you use the `bundled` feature, `libsqlite3-sys` will use the
2019-10-20 02:50:54 +08:00
[cc ](https://crates.io/crates/cc ) crate to compile SQLite from source and
2017-03-04 04:37:15 +08:00
link against that. This source is embedded in the `libsqlite3-sys` crate and
2019-12-14 02:17:14 +08:00
is currently SQLite 3.30.1 (as of `rusqlite` 0.21.0 / `libsqlite3-sys`
0.17.0). This is probably the simplest solution to any build problems. You can enable this by adding the following in your `Cargo.toml` file:
2020-03-08 22:36:56 +08:00
```toml
2017-05-02 15:36:41 +08:00
[dependencies.rusqlite]
2019-12-14 02:17:14 +08:00
version = "0.21.0"
2017-05-02 15:36:41 +08:00
features = ["bundled"]
```
2017-03-04 04:37:15 +08:00
* You can set the `SQLITE3_LIB_DIR` to point to directory containing the SQLite
library.
2017-05-30 02:58:27 +08:00
* Installing the sqlite3 development packages will usually be all that is required, but
the build helpers for [pkg-config ](https://github.com/alexcrichton/pkg-config-rs )
and [vcpkg ](https://github.com/mcgoo/vcpkg-rs ) have some additional configuration
2019-02-17 19:03:19 +08:00
options. The default when using vcpkg is to dynamically link,
which must be enabled by setting `VCPKGRS_DYNAMIC=1` environment variable before build.
`vcpkg install sqlite3:x64-windows` will install the required library.
2017-03-04 04:37:15 +08:00
### Binding generation
We use [bindgen ](https://crates.io/crates/bindgen ) to generate the Rust
declarations from SQLite's C header file. `bindgen`
[recommends ](https://github.com/servo/rust-bindgen#library-usage-with-buildrs )
running this as part of the build process of libraries that used this. We tried
this briefly (`rusqlite` 0.10.0, specifically), but it had some annoyances:
* The build time for `libsqlite3-sys` (and therefore `rusqlite` ) increased
dramatically.
* Running `bindgen` requires a relatively-recent version of Clang, which many
systems do not have installed by default.
* Running `bindgen` also requires the SQLite header file to be present.
As of `rusqlite` 0.10.1, we avoid running `bindgen` at build-time by shipping
pregenerated bindings for several versions of SQLite. When compiling
`rusqlite` , we use your selected Cargo features to pick the bindings for the
minimum SQLite version that supports your chosen features. If you are using
`libsqlite3-sys` directly, you can use the same features to choose which
pregenerated bindings are chosen:
* `min_sqlite_version_3_6_8` - SQLite 3.6.8 bindings (this is the default)
* `min_sqlite_version_3_6_23` - SQLite 3.6.23 bindings
2018-09-05 00:58:17 +08:00
* `min_sqlite_version_3_7_7` - SQLite 3.7.7 bindings
2017-03-04 04:37:15 +08:00
If you use the `bundled` feature, you will get pregenerated bindings for the
bundled version of SQLite. If you need other specific pregenerated binding
versions, please file an issue. If you want to run `bindgen` at buildtime to
produce your own bindings, use the `buildtime_bindgen` Cargo feature.
2015-12-13 05:04:11 +08:00
2020-01-15 00:11:36 +08:00
If you enable the `modern_sqlite` feature, we'll use the bindings we would have
included with the bundled build. You generally should have `buildtime_bindgen`
enabled if you turn this on, as otherwise you'll need to keep the version of
SQLite you link with in sync with what rusqlite would have bundled, (usually the
most recent release of sqlite). Failing to do this will cause a runtime error.
2014-11-05 00:32:06 +08:00
## Author
John Gallagher, johnkgallagher@gmail.com
## License
Rusqlite is available under the MIT license. See the LICENSE file for more info.