#async-orm #postgresql #sqlite #mysql #orm #mssql #sql-database

welds-connections

An async ORM for (postgres, mssql, mysql, sqlite)

6 releases

0.3.4 Apr 4, 2024
0.3.3 Apr 4, 2024
0.3.1 Mar 11, 2024

#1355 in Database interfaces

Download history 246/week @ 2024-03-03 271/week @ 2024-03-10 29/week @ 2024-03-17 59/week @ 2024-03-24 320/week @ 2024-03-31 88/week @ 2024-04-07 21/week @ 2024-04-14

492 downloads per month
Used in 2 crates (via welds)

BSD-3-Clause

84KB
2.5K SLoC

An async ORM written in rust using sqlx and tiberius.

Welds Connections

This is the common interface used by welds for all Databases.

It allows you to talk to sqlx and tiberius over traits in a simple common way.

Features

  • async for all.
  • Connections are pooled.
  • Transactions for all. (looking at you tiberius)
  • Support for multiple SQL databases (Mssql, MySql, Postgres, Sqlite)
  • Written for ease of development. Simple interface

The Simple interface

/// The common trait for database connections and transactions.
pub trait Client {
    /// Execute a sql command. returns the number of rows that were affected
    async fn execute(&self, sql: &str, params: &[&(dyn Param + Sync)]) -> Result<ExecuteResult>;

    /// Runs SQL and returns a collection of rows from the database.
    async fn fetch_rows(&self, sql: &str, params: &[&(dyn Param + Sync)]) -> Result<Vec<Row>>;

    /// Run several `fetch_rows` command on the same connection in the connection pool
    async fn fetch_many(&self, args: &[Fetch]) -> Result<Vec<Vec<Row>>>;

    // Returns what syntax (dialect) of SQL the backend is expecting
    fn syntax(&self) -> Syntax;
}

Thats it.

Thats All this crate is.

You get this for:

  • MySql and its transactions
  • Postgres and its transactions
  • Sqlite and its transactions
  • Mssql and its transactions

Transactions

You can get a transaction with the TransactStart Trait.


use welds_connections::{Client, TransactStart};
#[tokio::main]
async fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
    let url = "sqlite://./test.sqlite";
    let client = welds_connections::sqlite::get_conn(url).await?;
    let transaction = client.begin().await?;
    transaction.rollback.await?;
}

Example


use welds_connections::{Client, TransactStart};

#[tokio::main]
async fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {

    let url = "sqlite://./test.sqlite";
    let client = welds_connections::sqlite::get_conn(url).await?;

    let sql = "SELECT name from people where name like ?";
    let filter = "James%".to_string();
    let rows = client.fetch_rows(sql, &[&filter]).await?;

    for row in rows {
        let name: String = row.get("name").unwrap();
        println!("ROW: {:?}", &name);
    }
}

Dependencies

~7–25MB
~348K SLoC