Skip to main content

What's new in SeaORM 0.4.0

Β· 4 min read
SeaQL Team
Chris Tsang

πŸŽ‰ We are pleased to release SeaORM 0.4.0 today! Here are some feature highlights 🌟:

Rust Edition 2021#

[#273] Upgrading SeaORM to Rust Edition 2021 πŸ¦€β€πŸš!

Contributed by:

Carter Snook


[#252] You can now use Rust enums in model where the values are mapped to a database string, integer or native enum. Learn more here.

#[derive(Debug, Clone, PartialEq, DeriveEntityModel)]#[sea_orm(table_name = "active_enum")]pub struct Model {    #[sea_orm(primary_key)]    pub id: i32,    // Use our custom enum in a model    pub category: Option<Category>,    pub color: Option<Color>,    pub tea: Option<Tea>,}
#[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum)]#[sea_orm(rs_type = "String", db_type = "String(Some(1))")]// An enum serialized into database as a string valuepub enum Category {    #[sea_orm(string_value = "B")]    Big,    #[sea_orm(string_value = "S")]    Small,}
#[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum)]#[sea_orm(rs_type = "i32", db_type = "Integer")]// An enum serialized into database as an integer valuepub enum Color {    #[sea_orm(num_value = 0)]    Black,    #[sea_orm(num_value = 1)]    White,}
#[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum)]#[sea_orm(rs_type = "String", db_type = "Enum", enum_name = "tea")]// An enum serialized into database as a database native enumpub enum Tea {    #[sea_orm(string_value = "EverydayTea")]    EverydayTea,    #[sea_orm(string_value = "BreakfastTea")]    BreakfastTea,}
Designed by:

Chris Tsang
Contributed by:

Billy Chan

Supports RETURNING Clause on PostgreSQL#

[#183] When performing insert or update operation on ActiveModel against PostgreSQL, RETURNING clause will be used to perform select in a single SQL statement.

// For PostgreSQLcake::ActiveModel {    name: Set("Apple Pie".to_owned()),    ..Default::default()}.insert(&postgres_db).await?;
assert_eq!(    postgres_db.into_transaction_log(),    vec![Transaction::from_sql_and_values(        DbBackend::Postgres,        r#"INSERT INTO "cake" ("name") VALUES ($1) RETURNING "id", "name""#,        vec!["Apple Pie".into()]    )]);
// For MySQL & SQLitecake::ActiveModel {    name: Set("Apple Pie".to_owned()),    ..Default::default()}.insert(&other_db).await?;
assert_eq!(    other_db.into_transaction_log(),    vec![        Transaction::from_sql_and_values(            DbBackend::MySql,            r#"INSERT INTO `cake` (`name`) VALUES (?)"#,            vec!["Apple Pie".into()]        ),        Transaction::from_sql_and_values(            DbBackend::MySql,            r#"SELECT `cake`.`id`, `cake`.`name` FROM `cake` WHERE `cake`.`id` = ? LIMIT ?"#,            vec![15.into(), 1u64.into()]        )]);
Proposed by:

Marlon BrandΓ£o de Sousa
Contributed by:

Billy Chan

Axum Integration Example#

[#297] Added Axum integration example. More examples wanted!

Contributed by:



Our GitHub Sponsor profile is up! If you feel generous, a small donation will be greatly appreciated.

A big shout out to our first sponsors πŸ˜‡:

Shane Sveller
Zachary Vander Velden
Unnamed Sponsor


SeaQL is a community driven project. We welcome you to participate, contribute and together build for Rust's future.

Here is the roadmap for SeaORM 0.5.x.