#orm #sql #sqlx #crud

co-orm

Implement Create, Read, Update, and Delete (CRUD) methods for sqlx

17 releases

0.3.15 Aug 26, 2025
0.3.12 Aug 3, 2024
0.3.10 May 17, 2024
0.3.9 Mar 18, 2024
0.2.3 Oct 24, 2022

#1286 in Database interfaces

Download history

1,048 downloads per month

MIT license

33KB
484 lines

co-orm

Crates.io Docs Download

A high-performance, async CRUD library for sqlx that provides elegant database operations with compile-time safety.

Features

  • Zero-cost abstractions - Minimal runtime overhead
  • Type-safe queries - Compile-time SQL generation
  • Async-first - Built on tokio and sqlx
  • Flexible filtering - Powerful WHERE clause builder
  • Multiple databases - MySQL, PostgreSQL, SQLite support
  • Macro-driven - Simple derive macros for common operations

Installation

Add to your Cargo.toml:

[dependencies]
co-orm = { version = "0.3", features = ["mysql"] }
sqlx = { version = "0.8", features = ["mysql", "runtime-tokio-native-tls"] }

Available features: mysql, postgres, sqlite

Quick Start

Basic Model Definition

use co_orm::{Crud, sqlx::FromRow};
use chrono::NaiveDateTime;

#[derive(Debug, Crud, FromRow)]
#[co_orm(rename = "users")]
struct User {
    #[co_orm(skip_insert)]
    pub id: i64,
    #[co_orm(rename = "name")]
    pub name: String,
    #[co_orm(update)]
    pub password: String,
    #[co_orm(skip)]
    #[sqlx(skip)]
    pub addr: Option<String>,
    pub age: Option<u32>,
    #[co_orm(skip_insert)]
    pub update_at: Option<NaiveDateTime>,
}

Basic CRUD Operations

use co_orm::{Crud, Where};

// Get by primary key
let user = User::get(&pool, 1).await?;

// Query all
let users = User::query(&pool).await?;

// Insert
let new_user = User { /* ... */ };
new_user.insert(&pool).await?;

// Update
user.update(&pool).await?;

// Delete
user.delete(&pool).await?;

Advanced Querying

// Simple conditions
let users = User::query_where(&pool, Where::new()
    .eq("status", "active")
    .and()
    .ge("age", 18)
).await?;

// Complex grouped conditions
let users = User::query_where(&pool, Where::new()
    .eq("status", "active")
    .and_group(|w| {
        w.gt("age", 18)
         .and()
         .lt("age", 65)
    })
    .or_group(|w| {
        w.eq("name", "admin")
         .and()
         .ge("age", 21)
    })
).await?;

// Pagination
let (count, users) = User::query_page_where(
    &pool,
    Where::new().eq("status", "active"),
    1,  // page
    10  // page_size
).await?;

Available Methods

The #[derive(Crud)] macro generates these methods:

  • Read: get(), get_by(), get_where(), query(), query_by(), query_where()
  • Write: insert(), insert_all(), update(), update_by(), update_where()
  • Delete: delete(), delete_by(), delete_where()
  • Pagination: query_page_by(), query_page_where()

Field Attributes

Attribute Description
#[co_orm(id)] Mark as primary key (default: first field), for update and delete.
#[co_orm(skip_insert)] Skip field during insert operations
#[co_orm(rename = "name")] Rename table or field in database
#[co_orm(skip)] Ignore field completely
#[co_orm(update)] Generate update methods for this field

Query Operators

Method SQL Description
eq(col, value) = Equal
ne(col, value) <> Not equal
gt(col, value) > Greater than
lt(col, value) < Less than
ge(col, value) >= Greater or equal
le(col, value) <= Less or equal
like(col, value) LIKE Pattern matching
between(col, start, end) BETWEEN Range query
r#in(col, values) IN Set membership
is_null(col) IS NULL Null check
is_not_null(col) IS NOT NULL Not null check
raw(fragment) Custom Custom SQL fragment

Logical Operators

Method Description
and() AND logic
or() OR logic
and_group(f) AND grouping
or_group(f) OR grouping

Utility Macros

// Query arguments
let args = args!(&name, age);

// Pagination arguments  
let args = page_args!(&name, age);

// Raw queries
query!("INSERT INTO users (name, password) VALUES (?, ?)", name, password)
    .execute(&pool).await?;

// Typed queries
query_as!(User, "SELECT * FROM users WHERE name = ?", name)
    .fetch_one(&pool).await?;

Examples

See the examples/ directory for complete working examples:

  • crud.rs - Basic CRUD operations
  • where_examples.rs - Advanced querying patterns
  • pool.rs - Connection pool management

License

Licensed under the MIT License.

Dependencies

~11–30MB
~329K SLoC