sql-orm 0.1.0

Public API crate for the sql-orm workspace.
Documentation
use sql_orm::prelude::*;

#[derive(Entity, Debug, Clone)]
#[orm(table = "users", schema = "app")]
struct User {
    #[orm(primary_key)]
    #[orm(identity)]
    id: i64,

    #[orm(length = 120)]
    name: String,

    #[orm(has_one(Profile, foreign_key = user_id))]
    profile: Navigation<Profile>,

    #[orm(has_many(Post, foreign_key = user_id))]
    posts: Collection<Post>,

    #[orm(has_many(UserRole, foreign_key = user_id))]
    user_roles: LazyCollection<UserRole>,
}

#[derive(Entity, Debug, Clone)]
#[orm(table = "profiles", schema = "app")]
struct Profile {
    #[orm(primary_key)]
    #[orm(identity)]
    id: i64,

    #[orm(foreign_key(entity = User, column = id))]
    user_id: i64,

    #[orm(length = 120)]
    bio: String,
}

#[derive(Entity, Debug, Clone)]
#[orm(table = "posts", schema = "app")]
struct Post {
    #[orm(primary_key)]
    #[orm(identity)]
    id: i64,

    #[orm(foreign_key(entity = User, column = id))]
    user_id: i64,

    #[orm(length = 120)]
    title: String,

    #[orm(belongs_to(User, foreign_key = user_id))]
    user: Navigation<User>,
}

#[derive(Entity, Debug, Clone)]
#[orm(table = "roles", schema = "app")]
struct Role {
    #[orm(primary_key)]
    #[orm(identity)]
    id: i64,

    #[orm(length = 80)]
    name: String,

    #[orm(has_many(UserRole, foreign_key = role_id))]
    user_roles: Collection<UserRole>,
}

#[derive(Entity, Debug, Clone)]
#[orm(table = "user_roles", schema = "app")]
struct UserRole {
    #[orm(primary_key)]
    #[orm(identity)]
    id: i64,

    #[orm(foreign_key(entity = User, column = id, name = "fk_user_roles_user"))]
    user_id: i64,

    #[orm(foreign_key(entity = Role, column = id, name = "fk_user_roles_role"))]
    role_id: i64,

    #[orm(belongs_to(User, foreign_key = user_id))]
    user: Navigation<User>,

    #[orm(belongs_to(Role, foreign_key = role_id))]
    role: Navigation<Role>,
}

#[derive(DbContext, Debug, Clone)]
struct AppDb {
    pub users: DbSet<User>,
    pub profiles: DbSet<Profile>,
    pub posts: DbSet<Post>,
    pub roles: DbSet<Role>,
    pub user_roles: DbSet<UserRole>,
}

fn main() {
    let _surface = |db: &AppDb| {
        let _single_include = db
            .posts
            .query()
            .include_as::<User>("user", "user")
            .unwrap()
            .filter(User::id.aliased("user").gt(0_i64))
            .order_by(User::id.aliased("user").asc())
            .take(10);

        let _has_one_include = db
            .users
            .query()
            .include::<Profile>("profile")
            .unwrap()
            .first();

        let _collection_include = db
            .users
            .query()
            .include_many_as::<Post>("posts", "posts")
            .unwrap()
            .max_joined_rows(500)
            .filter(Post::id.aliased("posts").gt(0_i64))
            .all();

        let _navigation_join = db
            .users
            .query()
            .try_left_join_navigation_as::<UserRole>("user_roles", "user_roles")
            .unwrap()
            .try_inner_join_navigation_as::<Post>("posts", "posts")
            .unwrap()
            .filter(Post::id.aliased("posts").gt(0_i64));

        let mut user = User {
            id: 1,
            name: "Ana".to_string(),
            profile: Navigation::empty(),
            posts: Collection::empty(),
            user_roles: LazyCollection::unloaded(),
        };
        let _explicit_load = db.users.load_collection::<Post>(&mut user, "posts");

        let mut tracked = Tracked::from_loaded(User {
            id: 2,
            name: "Bruno".to_string(),
            profile: Navigation::empty(),
            posts: Collection::empty(),
            user_roles: LazyCollection::unloaded(),
        });
        let _tracked_explicit_load = db
            .users
            .load_collection_tracked::<Post>(&mut tracked, "posts");

        let _many_to_many_through_join_entity = db
            .user_roles
            .query()
            .try_left_join_navigation_as::<Role>("role", "role")
            .unwrap()
            .include::<User>("user")
            .unwrap()
            .filter(Role::id.aliased("role").gt(0_i64));
    };
}