Cherry is an asynchronous ORM, support MySQL, PostgreSQL, SQLite and SQL Server. It's lightweight and build on top of SQLx.
WARNING: This crate is under development (mysql is partial tested at the moment).
enable one of the database features ['mysql', 'postgres', 'sqlite', 'mssql'].
And enable one of the features ['runtime-actix-native-tls', 'runtime-async-std-native-tls', 'runtime-tokio-native-tls', 'runtime-actix-rustls', 'runtime-async-std-rustls', 'runtime-tokio-rustls']. More details see SQLx Feature Flags.
```toml
[dependencies] cherry = { version = "0.2.2", features = ["mysql", "runtime-async-std-rustls"] } cherry-derive = "0.2.2" ```
You can set multiple DataSources as you need.
```rust use std::any::Any; use std::error::Error;
use cherry::connection::{self, PoolConfig}; use cherry::DataSource;
pub async fn setup() -> Result<(), Box
// Setup the database connection pools.
connection::setup_pools(config).await?;
Ok(())
}
pub struct Foo; pub struct Bar;
impl DataSource for Foo {} impl DataSource for Bar {} ```
```rust
struct User { id: u64, name: String, }
struct Book { id: u64, name: String, } ```
```rust
async fn insert() -> Result<(), Box
// Insert multiple
let users = [
User { id: 2, name: "Sam".to_owned() },
User { id: 3, name: "Jack".to_owned() }
];
let result = Foo.insert_bulk(&users).execute().await?;
assert_eq!(result.rows_affected(), 2);
Ok(())
}
``
Also support other insertion such as:
insert replace,
insert ignore` ...
```rust
async fn delete() -> Result<(), Box
Ok(())
} ```
```rust
async fn update() -> Result<(), Box
Ok(())
} ```
```rust
async fn select() -> Result<(), Box
// Select list.
let result: Vec<User> = Foo.select()
.and_where_between("id", 100, 200)
.and_where_ne("name", "Jack")
.fetch_all()
.await?;
Ok(())
} ```
```rust use cherry::types::Transaction;
async fn transaction() -> Result<(), Box
let books = [
Book { id: 1, name: "Book name 1".to_owned() },
Book { id: 2, name: "Book name 2".to_owned() }
];
// Without transaction
Foo.insert_bulk(&users).execute().await?;
// Auto transaction
Foo.insert_bulk(&users).execute_tx().await?;
// Manual transaction
let mut tx: Transaction = Foo.begin().await?;
Foo.insert_bulk(&users).execute_with(&mut tx).await?;
Foo.insert_bulk(&books).execute_with(&mut tx).await?;
tx.commit().await?;
// Or tx.rollback().await?;
Ok(())
} ```