2019-12-28 01:31:01 +00:00
< h1 align = "center" > SQLx< / h1 >
< div align = "center" >
< strong >
🧰 The Rust SQL Toolkit
< / strong >
< / div >
< br / >
< div align = "center" >
2019-12-30 10:29:56 +00:00
<!-- Version -->
2019-12-28 01:31:01 +00:00
< a href = "https://crates.io/crates/sqlx" >
< img src = "https://img.shields.io/crates/v/sqlx.svg?style=flat-square"
alt="Crates.io version" />
< / a >
2020-01-12 18:22:12 +00:00
<!-- Discord -->
2020-01-12 22:02:52 +00:00
< a href = "https://discord.gg/uuruzJ7" >
< img src = "https://img.shields.io/discord/665528275556106240?style=flat-square" alt = "chat" / >
< / a >
2019-12-28 01:31:01 +00:00
<!-- Downloads -->
< a href = "https://crates.io/crates/sqlx" >
< img src = "https://img.shields.io/crates/d/sqlx.svg?style=flat-square"
alt="Download" />
< / a >
2019-12-30 10:29:56 +00:00
<!-- Docs -->
2019-12-28 01:31:01 +00:00
< a href = "https://docs.rs/sqlx" >
< img src = "https://img.shields.io/badge/docs-latest-blue.svg?style=flat-square"
alt="docs.rs docs" />
< / a >
2019-12-30 10:29:56 +00:00
<!-- Github Actions -->
< img src = "https://img.shields.io/github/workflow/status/launchbadge/sqlx/Rust?style=flat-square" alt = "actions status" / >
2019-12-28 01:31:01 +00:00
< / div >
2019-12-28 09:37:02 +00:00
< br / >
2019-12-28 01:31:01 +00:00
< div align = "center" >
2019-12-28 01:31:53 +00:00
< sub > Built with ❤️ by < a href = "https://launchbadge.com" > The LaunchBadge team< / a >
2019-12-28 01:31:01 +00:00
< / div >
< br / >
2020-01-15 09:36:00 +00:00
SQLx is an async, pure Rust SQL crate featuring compile-time checked queries without a DSL.
2019-12-28 01:31:01 +00:00
2020-01-15 09:27:19 +00:00
* **Truly Asynchronous**. Built from the ground-up using async/await for maximum concurrency.
2019-12-28 01:31:01 +00:00
2019-12-28 10:38:53 +00:00
* **Type-safe SQL** (if you want it) without DSLs. Use the `query!()` macro to check your SQL and bind parameters at
2019-12-30 15:11:43 +00:00
compile time. (You can still use dynamic SQL queries if you like.)
2019-12-28 09:37:02 +00:00
2019-12-28 10:38:53 +00:00
* **Pure Rust**. The Postgres and MySQL/MariaDB drivers are written in pure Rust using **zero** unsafe code.
2020-01-15 09:27:19 +00:00
* **Runtime Agnostic**. Works on [async-std ](https://crates.io/crates/async-std ) or [tokio ](https://crates.io/crates/tokio ) with the `runtime-async-std` or `runtime-tokio` cargo feature flag.
## Install
**async-std**
```toml
# Cargo.toml
[dependencies]
sqlx = "0.2"
```
**tokio**
```toml
# Cargo.toml
[dependencies]
2020-01-15 17:56:39 +00:00
sqlx = { version = "0.2", default-features = false, features = [ "runtime-tokio", "macros" ] }
2020-01-15 09:27:19 +00:00
```
#### Cargo Feature Flags
* `runtime-async-std` (on by default): Use the `async-std` runtime.
* `runtime-tokio` : Use the `tokio` runtime. Mutually exclusive with the `runtime-async-std` feature.
* `postgres` : Add support for the Postgres database server.
* `mysql` : Add support for the MySQL (and MariaDB) database server.
* `uuid` : Add support for UUID (in Postgres).
* `chrono` : Add support for date and time types from `chrono` .
* `tls` : Add support for TLS connections.
2019-12-28 09:37:02 +00:00
## Examples
2020-01-15 09:27:19 +00:00
#### Connect
It is a very good idea to always create a connection pool at the beginning of your application
and then share that.
```rust
2020-01-15 11:44:57 +00:00
// Postgres
2020-01-15 09:27:19 +00:00
let pool = sqlx::PgPool::new("postgres://localhost/database").await?;
```
#### Dynamic
2019-12-28 09:37:02 +00:00
The `sqlx::query` function provides general-purpose prepared statement execution.
The result is an implementation of the `Row` trait. Values can be efficiently accessed by index or name.
```rust
let row = sqlx::query("SELECT is_active FROM users WHERE id = ?")
.bind(some_user_id)
.fetch_one(& mut conn)
.await?;
let is_active: bool = row.get("is_active");
```
2020-01-15 09:27:19 +00:00
#### Static
2019-12-28 09:37:02 +00:00
The `sqlx::query!` macro prepares the SQL query and interprets the result in order to constrain input types and
2020-01-12 06:22:24 +00:00
infer output types. The result of `query!` is an anonymous struct (or named tuple).
2019-12-28 09:37:02 +00:00
```rust
let countries = sqlx::query!(
"SELECT country, COUNT(*) FROM users GROUP BY country WHERE organization = ?",
organization
)
.fetch(& mut conn) // -> impl Stream< Item = { country: String , count: i64 } >
.map_ok(|rec| (rec.country, rec.count))
.collect::< HashMap < _ > >() // -> HashMap< String , i64 >
.await?;
```
2019-12-29 04:42:25 +00:00
See the beginnings of a [RealWorld ](https://github.com/gothinkster/realworld/tree/master/api#users-for-authentication ) implementation in [examples/realworld-postgres ](./examples/realworld-postgres ).
2019-12-28 09:41:07 +00:00
2019-12-28 01:31:01 +00:00
## Safety
2019-08-07 05:47:32 +00:00
2020-01-03 19:45:18 +00:00
This crate uses `#[forbid(unsafe_code)]` to ensure everything is implemented in 100% Safe Rust.
2019-06-09 16:38:10 +00:00
2019-06-06 13:02:55 +00:00
## License
Licensed under either of
* Apache License, Version 2.0
([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
* MIT license
([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
at your option.
## Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.