31 个版本

0.5.2 2023年11月16日
0.5.1 2023年6月29日
0.5.0 2022年8月16日
0.4.0 2022年6月16日
0.1.9 2020年11月18日

#346数据库接口

Download history 10/week @ 2024-06-30 141/week @ 2024-07-07 902/week @ 2024-07-28

1,043 每月下载量

MIT 许可证

105KB
2.5K SLoC

arysn 是 Rust ORM 代码生成器。

查看 arysn-test/build.rs, arysn-test/tests

连接

要访问 Postgresql,请使用 tokio-postgres。您还可以使用 deadpool-postgres

代码生成

define_ar 用于生成代码。

use arysn::generator::config::{BelongsToConfig, Config, HasManyConfig};
use arysn::generator::define_ar;

fn main() {
    define_ar(vec![
        Config {
            path: "src/generated/user.rs",
            table_name: "users",
            struct_name: "User",
            has_many: vec![
                HasManyConfig {
                    field: "roles",
                    struct_name: "Role",
                    foreign_key: "user_id",
                },
            ],
            has_one: vec![],
            belongs_to: vec![],
        },
        Config {
            path: "src/generated/role.rs",
            table_name: "roles",
            struct_name: "Role",
            has_many: vec![],
            has_one: vec![],
            belongs_to: vec![BelongsToConfig {
                field: "user",
                struct_name: "User",
                foreign_key: "user_id",
            }
        }
    ]).unwrap();

将生成以下四个文件。

  • user.rs
  • user_impl.rs
  • role.rs
  • role_impl.rs
  • enums.rs

user.rs 和 role.rs 旨在用于 Yew 等前端应用程序。user_impl.rs 和 role_impl.rs 包含数据库访问代码。enums.rs 由 CREATE TYPE SQL 生成。

查询

let conn = ... // tokio-postgres or deadpool-postgres client
let users: Vec<User> = User::select().active().eq(true).load(&conn).await?;

let user: User = User::select().id(1).first(&conn).await?;

use arysn::Optional;
let user: Option<Vec> = User::select().id(1).first(&conn).await.optional()?;

连接

let users: Vec<User> = User::select().roles(|role| role.role_type().eq(RoleType::Admin))
    .load(&conn).await?;

N+1

let users: Vec<User> = User::select().roles(|role| role.preload())
    .load(&conn).await?;

SQL 看起来像这样

SELECT * FORM users;
SELECT * FROM rolse WERE WHERE id IN (....);

预加载之前的条件用于连接。

let users: Vec<User> = User::select()
    .roles(|role| role.role_type().eq(RoleType::Admin).preload())
    .load(&conn).await?;

SQL 看起来像这样

SELECT * FORM users INNER JOIN roles ON roles.user_id=users.id
    WHERE roles.role_types='admin';
SELECT * FROM rolse WERE WHERE role_types='admin' id IN (....);

预加载之后的条件在连接时不使用。

let users: Vec<User> = User::select()
    .roles(|role| role.preload().role_type().eq(RoleType::Admin))
    .load(&conn).await?;

SQL 看起来像这样

SELECT * FORM users;
SELECT * FROM rolse WERE WHERE role_types='admin' id IN (....);

UUID

要使用 UUID,您需要指定 tokio-postgres 和 uuid 的特性。

Cargo.toml

[dependencies]
tokio-postgres = { version = "0.7", features = ["with-chrono-0_4", "with-uuid-0_8"] }
uuid = { version = "0.8", features = ["serde"] }

PostGIS

仅支持 PostGIS POINT。您必须指定 gis 特性。

Cargo.toml

[dependencies]
arysn = { version = "0.3", features = ["gis"] }

依赖项

~11–23MB
~325K SLoC