7 releases

Uses old Rust 2015

0.3.0 Nov 19, 2018
0.2.4 Nov 15, 2018
0.1.0 Nov 12, 2018

#1817 in Database interfaces

Download history 19/week @ 2024-02-19 8/week @ 2024-03-11 45/week @ 2024-04-01

53 downloads per month

MIT license

192 lines


A database interface for Rust, based loosely on the SQL Objects API of Java's Jdbi.

Uses Rust 1.30's procedural macros. Works on stable (current) Rust.

Currently only supports mysql (via mysql_async), but support for other database systems is planned.


Define a trait with methods conforming to params and desired results for any number of queries, and pass in the SQL string in the method attributes:

pub trait UserDaoImpl {

    #[sql_query("SELECT * FROM users WHERE id = :id", use_named_params=true)]
    fn find_by_id(self, id: i32) -> Box<Future<Item=Option<User>, Error=my::errors::Error> + Send>;

    #[sql_query("SELECT * FROM users WHERE id = ?", mapper="|row| { let (id, full_name) = my::from_row_opt(row)?; Ok(User {id, full_name}) }")]
    fn find_by_id_faster(self, id: i32) -> Box<Future<Item=Option<User>, Error=my::errors::Error> + Send>;

    #[sql_query("SELECT name FROM users")]
    fn find_all_names(self) -> Box<futures::Future<Item=Vec<String>, Error=my::errors::Error> + Send>;

    #[sql_update("INSERT INTO users (name) VALUES (:name)", use_named_params=true)]
    fn create_user_named(self, name: String) -> Box<futures::Future<Item=Option<u64>, Error=my::errors::Error> + Send>;


This will create a "connection-like" newtype wrapper that you can use like:

let fut = UserDao(conn).find_by_id(2);

Trait methods must return a value that looks like Box<Future<Item=R> ...>, where R is an Option<T> or Vec<T> and T is a type that can be extracted from a database row.

Currently supports the following options:

  • use_named_params: Uses the method's param names instead of position in formatting query params.
  • mapper: use some other expression to map to a result type. Can be a closure or other method.

More features are planned, although this library will not provide all the options that Jdbi does.


  • 0.3.0

    • Add sql_batch. Currently does not return any value (only works with a method that returns Future<Item=()>,...>). Similar to Jdbi, each param is passed in as its own container (e.g., each named param would have a method arg that looks like name: Vec<String>).


~416K SLoC