About Dysql
Dysql is a highly Performant Rust SQL Toolkit and ORM Library. An async, pure Rust SQL crate featuring compile-time Dynamic SQL.
It bases on tokio-postgres and sqlx crate (default feature), you can switch them by setting the features.
It uses Ramhorns the high performance template engine implementation of Mustache template language (a very very very simply template language) :-).
It invokes like blow:
dysql_macro!(| dto, conn_or_tran | [-> return_type | -> (return_type ,dialect)] { ...sql string... });
Note: Dialect can be blank, and the default value is postgres, and dialect also supports mysql, sqlite.
Example (sqlx)
Full example please see: Dysql sqlx example
Cargo.toml:
[dependencies]
dysql = "0.6"
dysql-macro = {version = "0.5", features = ["sqlx"]}
sqlx = { version = "0.6", features = [ "runtime-tokio-native-tls" , "postgres" ] }
tokio = { version = "1.0", features = ["full"] }
ramhorns = "0.14"
tokio-postgres = { version = "0.7", features = ["with-chrono-0_4"] }
main.rs
...
#[tokio::main]
async fn main() {
let conn = connect_postgres_db().await;
let dto = UserDto{ id: None, name: None, age: Some(15) };
let rst = fetch_all!(|&dto, &conn| -> User {
r#"SELECT * FROM test_user
WHERE 1 = 1
{{#name}}AND name = :name{{/name}}
{{#age}}AND age > :age{{/age}}
ORDER BY id"#
}).unwrap();
assert_eq!(
vec![
User { id: 2, name: Some("zhanglan".to_owned()), age: Some(21) },
User { id: 3, name: Some("zhangsan".to_owned()), age: Some(35) }
],
rst
);
let dto = dysql::Value::new(2_i64); let rst = fetch_one!(|&dto, &conn| -> User {
r#"select * from test_user
where 1 = 1
and id = :value
order by id"#
}).unwrap();
assert_eq!(User { id: 2, name: Some("zhanglan".to_owned()), age: Some(21) }, rst);
let rst = fetch_scalar!(|_, &conn| -> i64 {
r#"select count (*) from test_user"#
}).unwrap();
assert_eq!(3, rst);
let affected_rows_num = execute!(|&dto, &mut tran| {
r#"delete from test_user where id = :id"#
}).unwrap();
...
let insert_id = insert!(|&dto, &mut tran| {
r#"insert into test_user (id, name, age) values (:id, :name, :age) returning id"#
}).unwrap();
...
let dto = UserDto{ id: Some(4), name: Some("lisi".to_owned()), age: Some(50) };
let insert_id = insert!(|dto, &mut tran| -> (_, mysql) { r#"insert into test_user (name, age) values ('aa', 1)"#
}).unwrap();
...
}
Example (tokio-postgres)
Full example please see: Dysql tokio-postgres example
License
Dysql is free software, and is released under the terms of the Apache License version 2. See LICENSE.