[Rust] SeaORM

Rust์—์„œ ์“ธ๋งŒํ•œ SQL ๋„๊ตฌ๊ฐ€ 3๊ฐœ ์ •๋„ ์žˆ๋Š”๋ฐ, ์ด๊ฒŒ ๊ทธ ์ค‘ ํ•˜๋‚˜๋‹ค.
๋‹ค๋ฅธ ๊ฒƒ๋“ค๋กœ๋Š” sqlx, diesel ์ •๋„๊ฐ€ ์žˆ๋‹ค.

sqlx ๊ธฐ๋ฐ˜์ด๋ฉฐ, Active Record ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๋Š” ORM ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.




๊ธฐ๋ณธ ์„ค์ •

๋””ํŽœ๋˜์‹œ๋Š” 3๊ฐœ์ฏค์€ ๊ธฐ๋ณธ์œผ๋กœ ๊ฐ–๊ณ ๊ฐ„๋‹ค ๋ณด๋ฉด ๋œ๋‹ค.

futures = "0.3.30"
sea-orm = { version = "^0.12.0", features = [ "sqlx-postgres", "runtime-tokio-native-tls", "macros" ] }
tokio = { version = "1.35.1", features = ["full"] }

futures์™€ ๋น„๋™๊ธฐ ๋Ÿฐํƒ€์ž„์ด๋‹ค.
๋‚ด ๊ฒฝ์šฐ์—๋Š” postgresql๊ณผ tokio๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋””ํŽœ๋˜์‹œ๊ฐ€ ์ €๋ ‡๋‹ค.
db๋Š” postgres, mysql, sqlite ์ •๋„๋ฅผ ์ง€์›ํ•˜๊ณ , ๋น„๋™๊ธฐ ๋Ÿฐํƒ€์ž„์€ tokio, async-std ์ •๋„๋งŒ ์ง€์›ํ•œ๋‹ค.

๊ธฐ๋ณธ ์ปค๋„ฅ์…˜ ์„ค์ •์€ ์ด์ •๋„๋กœ ํ•˜๋ฉด ๋œ๋‹ค.

DB ์ ‘์† URL์„ ๋ผ์›Œ๋„ฃ๊ณ  ์˜ต์…˜ ๊ฐ์ฒด ์ƒ์„ฑ, ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜๋ฉด ๋œ๋‹ค.


ํ•‘ ์ฐ์–ด์„œ ์ž˜ ์‹คํ–‰๋˜๋ฉด ์„ธํŒ…์€ ์ž˜ ๋œ ๊ฒƒ์ด๋‹ค.




์—”ํ‹ฐํ‹ฐ ๋งŒ๋“ค๊ธฐ

seaorm์€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์ง€ํ–ฅํ•œ๋‹ค.

๊ทผ๋ฐ ์—”ํ‹ฐํ‹ฐ ์ •์˜๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์— ๋น„ํ•ด ์ข€ ์žฅํ™ฉํ•œ ํŽธ์ด๋‹ค.
๊ทธ๋ƒฅ ๊ฐ„๋‹จํ•œ ์—”ํ‹ฐํ‹ฐ ํ•˜๋‚˜๋งŒ ์ •์˜ํ•ด๋„

use sea_orm::entity::prelude::*;
#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
#[sea_orm(table_name = "student")]
pub struct Model {
    #[sea_orm(primary_key)]
    pub id: i32,
    pub name: String,
    #[sea_orm(column_name = "schoolName")]
    pub school_name: String,
}

#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {}

impl ActiveModelBehavior for ActiveModel {}

์ด์ •๋„๋Š” ๊ธฐ๋ณธ์œผ๋กœ ๊น”๊ณ ๊ฐ€์•ผํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ € ๊ตฌ์กฐ์ฒด๋“ค์ด ๋งคํฌ๋กœ ์ƒ์„ฑ์„ ํ†ตํ•ด ๊ธฐ๋ฌ˜ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด์žˆ๋Š” ํ˜•ํƒœ๋ผ์„œ, ์ € ์„ธํŠธ๋ฅผ ๊ฐ๊ฐ ๋ณ„๋„์˜ ํŒŒ์ผ์ด๋‚˜ ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ๊ฒฉ๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

๋‚œ ์ผ๋‹จ ์›์ฝ”๋“œ๋กœ ๊ฐ€๊ฒ ๋‹ค.




SeaORM CLI

ํ•„์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ „์šฉ ๋„๊ตฌ๊ฐ€ ๋˜ ์žˆ๋‹ค.
๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ฟผ๋ฆฌ ์ž‘์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์šฉ๋„์ธ๋ฐ, Windows์—์„œ๋Š” ์„ค์น˜๊ฐ€ ์ž˜ ์•ˆ๋˜๋”๋ผ.
์ข€.. ํฌ๋กœ์Šคํ”Œ๋žซํผํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ์•ˆ๋˜๋‚˜?

cargo install sea-orm-cli

์„ค์น˜๋˜๋ฉด sea๋ผ๋Š” ๋ช…๋ น์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ


init์„ ๋•Œ๋ฆฌ๋ฉด


๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์šฉ ์„œ๋ธŒํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
์ €๊ฑธ ์‹คํ–‰ํ•ด์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๋Œ๋ฆฌ๋ผ๋Š” ์˜๋ฏธ๋‹ค.

๊ทผ๋ฐ ์—”ํ‹ฐํ‹ฐ์—์„œ ์ž๋™์ƒ์„ฑํ•ด์ฃผ๊ฑฐ๋‚˜ ๊ทธ๋Ÿฐ๊ฑด ์—†๋Š”๊ฑฐ๊ฐ™๋‹ค... ์ด๋Ÿฐ ๋ถ€๋ถ„์€ ๋””์ ค์ด ๋‚ซ๋‹ค.


๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋‹จ์œ„๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด generate๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค.




CRUD ๋Œ๋ ค๋ณด๊ธฐ

seaorm์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ค ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌํ•˜๋Š”์ง€ ํ•œ๋ฒˆ ํ›‘์–ด๋ณด์ž.

๋ฐ์ดํ„ฐ์˜ ์ƒ์„ฑ์€ ์ด๋Ÿฐ์‹์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , active ๋ชจ๋ธ๋กœ ์ „ํ™˜ํ•œ ๋‹ค์Œ์— insert ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค.


๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ ๋“ค์–ด๊ฐˆ ๊ฒƒ์ด๋‹ค.

์ˆ˜์ •์€ ๊ทธ์— ๋น„ํ•ด ์ข€ ๊ฐ„ํŽธํ•œ ํŽธ์ด๋‹ค.

์•กํ‹ฐ๋ธŒ ๋ชจ๋ธ๋กœ ์ƒ์„ฑ๋œ ์ƒํƒœ์—์„œ Set ๋“ฑ์œผ๋กœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ณ , ๋งˆ์ง€๋ง‰์— update๋ฅผ ์น˜๋ฉด ๋ณ€๊ฒฝํ•œ ๋‚ด์—ญ๋“ค์„ ์‹ค์ œ DB์— ์—…๋ฐ์ดํŠธ ์น˜๋Š” ํ˜•ํƒœ๋‹ค.
์ €๊ธฐ์„œ model์„ ์ƒ์„ฑํ• ๋•Œ๋Š”, primary key๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ฐพ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ๊ฑด ์ผ์น˜ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.


์ž˜ ์ฐพ์•„์„œ ์ˆ˜์ •ํ•ด์คฌ๋‹ค.

์กฐํšŒ๋Š” ์ €๋ ‡๊ฒŒ ํ•˜์ง€๋Š” ์•Š๊ณ , Entity์— ๋‹ฌ๋ฆฐ ์ •์ ๋ฉ”์„œ๋“œ๋“ค์„ ํ†ตํ•ด์„œ ์กฐํšŒํ•˜๋Š”๊ฒŒ ๋ณดํ†ต์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ ๋‹นํžˆ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ด๋‹ค.
์ € ์ƒํƒœ์—์„œ ๋ญ ๊ฐ€๊ณต์ด ๋” ํ•„์š”ํ•˜๋‹ค๋ฉด active model๋กœ ์ „ํ™˜ํ•ด์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

delete๋„ update์™€ ์‚ฌ์šฉ๋ฒ•์€ ๋น„์Šทํ•œ ํŽธ์ด๋‹ค.

๊ทธ๋ƒฅ ๋‚ ๋ฆฌ๋ฉด ๋œ๋‹ค.



์ฐธ์กฐ
https://www.sea-ql.org/SeaORM/