🛺

【Rust】SeaORMのDateTimeWithTimeZone型に値を設定する

に公開

概要

RustのORMライブラリ「SeaORM」では、例えばPostgreSQLのtimestampz型のようなタイムゾーンを考慮した日付列に対応するための型が用意されています。具体的にはDateTimeWithTimeZoneという型があるのですが、ではDateTimeWithTimeZone型に値を設定するとなった時の実装をどうするかというメモ書きです。

前提

  • 使用したSeaORMのバージョンは1.1.16です。

対応方針

SeaORMのドキュメントColumn TypesにDateTimeWithTimeZone型の記載があります。chrono::DateTime<FixedOffset>型と互換性があるそうです。つまり一度chrono::DateTime<FixedOffset>で値を作成した後に、列項目にその値を設定すればよいということになります。

実装サンプル

まずはModelです。以下の通り用意します。

pub struct Model {
    #[sea_orm(primary_key)]
    pub id: String,
    pub name: String,
    pub created_at: DateTimeWithTimeZone,
}

値の設定用に、現在日付をDateTime<FixedOffset>で取得する関数を用意します。

pub fn get_now_jst_datetime_fixed_offset() -> DateTime<FixedOffset> {
    let jst = FixedOffset::east_opt(9 * 3600).unwrap();
    jst.from_utc_datetime(&Utc::now().naive_utc())
}

Modelに日付の値を設定します。

let sample_datetime_model = sample_model::Model {
    id: Uuid::now_v7().to_string(),
    name: "テストネーム".to_string(),
    created_at: get_now_jst_datetime_fixed_offset().into(),
};

Discussion