[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์ ์ฌ์ฉ๋ฒ์ ๋น์ทํ ํธ์ด๋ค.

๊ทธ๋ฅ ๋ ๋ฆฌ๋ฉด ๋๋ค.