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 在 数据库接口
1,043 每月下载量
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