Have a question? Be sure to check the FAQ first!
SQLx is an async, pure Rust† SQL crate featuring compile-time checked queries without a DSL.
-
Truly Asynchronous. Built from the ground-up using async/await for maximum concurrency.
-
Compile-time checked queries (if you want). See SQLx is not an ORM.
-
Database Agnostic. Support for PostgreSQL, MySQL, MariaDB, SQLite.
- MSSQL was supported prior to version 0.7, but has been removed pending a full rewrite of the driver as part of our SQLx Pro initiative.
-
Pure Rust. The Postgres and MySQL/MariaDB drivers are written in pure Rust using zero unsafe†† code.
-
Runtime Agnostic. Works on different runtimes (
async-std/tokio/actix) and TLS backends (native-tls,rustls).
† The SQLite driver uses the libsqlite3 C library as SQLite is an embedded database (the only way we could be pure Rust for SQLite is by porting all of SQLite to Rust).
†† SQLx uses #![forbid(unsafe_code)] unless the sqlite feature is enabled.
The SQLite driver directly invokes the SQLite3 API via libsqlite3-sys, which requires unsafe.
-
Cross-platform. Being native Rust, SQLx will compile anywhere Rust is supported.
-
Built-in connection pooling with
sqlx::Pool. -
Row streaming. Data is read asynchronously from the database and decoded on demand.
-
Automatic statement preparation and caching. When using the high-level query API (
sqlx::query), statements are prepared and cached per connection. -
Simple (unprepared) query execution including fetching results into the same
Rowtypes used by the high-level API. Supports batch execution and returns results from all statements. -
Transport Layer Security (TLS) where supported (MySQL, MariaDB and PostgreSQL).
-
Asynchronous notifications using
LISTENandNOTIFYfor PostgreSQL. -
Nested transactions with support for save points.
-
Anydatabase driver for changing the database driver at runtime. AnAnyPoolconnects to the driver indicated by the URL scheme.
SQLx is compatible with the async-std, tokio, and actix runtimes; and, the native-tls and rustls TLS backends. When adding the dependency, you must choose a runtime feature that is runtime + tls.
# Cargo.toml
[dependencies]
# PICK ONE OF THE FOLLOWING:
# tokio (no TLS)
sqlx = { version = "0.9", features = [ "runtime-tokio" ] }
# tokio + native-tls
sqlx = { version = "0.9", features = [ "runtime-tokio", "tls-native-tls" ] }
# tokio + rustls with ring and WebPKI CA certificates
sqlx = { version = "0.9", features = [ "runtime-tokio", "tls-rustls-ring-webpki" ] }
# tokio + rustls with ring and platform's native CA certificates
sqlx = { version = "0.9", features = [ "runtime-tokio", "tls-rustls-ring-native-roots" ] }
# tokio + rustls with aws-lc-rs
sqlx = { version = "0.9", features = [ "runtime-tokio", "tls-rustls-aws-lc-rs" ] }
# async-std (no TLS)
sqlx = { version = "0.9", features = [ "runtime-async-std" ] }
# async-std + native-tls
sqlx = { version = "0.9", features = [ "runtime-async-std", "tls-nat