🦀

SeaORMを使い既存のDBのテーブルからエンティティファイルを生成する

2024/10/11に公開

この記事を書くにあたって

Rustで自作アプリを作っている際、データベースの操作するために、ORMにSeaORMを使いました。
 SeaORMのコマンドを利用して、既存のテーブルからエンティティファイルを作成しました。今後似たような実装をするときのために簡単な手順書として残しておきたいと思ったのでここに書き留めておきます。

この記事で説明しないこと

  • ORMのインストール、セットアップ方法
  • エンティティファイルの説明
  • DBの操作方法

実演

データベースの状況確認

エンティティの元になるテーブルの状況はこのようになります。(version = "0.12.2")
staffs(子)のdepartment_iddepartments(親)の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でstaffsJoining_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