🦀
SeaORMを使い既存のDBのテーブルからエンティティファイルを生成する
この記事を書くにあたって
Rustで自作アプリを作っている際、データベースの操作するために、ORMにSeaORMを使いました。
SeaORMのコマンドを利用して、既存のテーブルからエンティティファイルを作成しました。今後似たような実装をするときのために簡単な手順書として残しておきたいと思ったのでここに書き留めておきます。
この記事で説明しないこと
- ORMのインストール、セットアップ方法
- エンティティファイルの説明
- DBの操作方法
実演
データベースの状況確認
エンティティの元になるテーブルの状況はこのようになります。(version = "0.12.2")
※ staffs
(子)のdepartment_id
は departments
(親)のid
外部キーになります。
エンティティ作成コマンド実行
SeaORMのエンティティを作成するコマンドを実行します。
※-u
にDBのURL、-o
にエンティティファイルの出力先のパスを指定します。
sea-orm-cli generate entity -u mysql://root:password@localhost:3306/test_db -o src/database/entities
コマンド実行後、エンティティファイルとインデックスファイルが生成されます。
※以下は、staffsテーブルのエンティティファイル
staffs.rs
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15
use sea_orm::entity::prelude::*;
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)]
#[sea_orm(table_name = "staffs")]
pub struct Model {
#[sea_orm(primary_key)]
pub id: i32,
pub staff_name: Option<String>,
pub department_id: Option<i32>,
}
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {
#[sea_orm(
belongs_to = "super::departments::Entity",
from = "Column::DepartmentId",
to = "super::departments::Column::Id",
on_update = "NoAction",
on_delete = "NoAction"
)]
Departments,
}
impl Related<super::departments::Entity> for Entity {
fn to() -> RelationDef {
Relation::Departments.def()
}
}
impl ActiveModelBehavior for ActiveModel {}
※DB内のすべてのテーブルのエンティティが生成されます。
おまけ
テーブル編集時のエンティティ作成
テーブル編集後も、上記と同じコマンドでエンティティに変更を反映できます。
試しに、下記SQLでstaffs
にJoining_date
を追加します。
ALTER TABLE staffs ADD Joining_date date;
Joining_date
が追加されました。
先ほどと同じエンティティ生成コマンドを実行します。
sea-orm-cli generate entity -u mysql://root:password@localhost:3306/test_db -o entity/src
↓joining_dateカラム追加が反映されている。
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15
use sea_orm::entity::prelude::*;
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)]
#[sea_orm(table_name = "staffs")]
pub struct Model {
#[sea_orm(primary_key)]
pub id: i32,
pub staff_name: Option<String>,
pub department_id: Option<i32>,
#[sea_orm(column_name = "Joining_date")]
pub joining_date: Option<Date>,
}
~~~以下省略~~~
Discussion