Skip to content

Latest commit

Β 

History

History
1935 lines (1519 loc) Β· 79.8 KB

CHANGELOG.md

File metadata and controls

1935 lines (1519 loc) Β· 79.8 KB

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

1.1.0 - Pending

Versions

  • 1.1.0-rc.1: 2024-08-09

Upgrades

1.0.1 - 2024-08-26

New Features

  • Added ConnectOptions::connect_lazy for creating DB connection pools without establishing connections up front SeaQL#2268

Breaking Changes

  • Changed ProxyDatabaseTrait methods to async. It's a breaking change, but it should have been part of the 1.0 release. The feature is behind the feature guard proxy, and we believe it shouldn't impact majority of users. SeaQL#2278

Bug Fixes

  • [sea-orm-codegen] Fix ColumnType to Rust type resolution SeaQL#2313

1.0.0 - 2024-08-02

Versions

  • 1.0.0-rc.1: 2024-02-06
  • 1.0.0-rc.2: 2024-03-15
  • 1.0.0-rc.3: 2024-03-26
  • 1.0.0-rc.4: 2024-05-13
  • 1.0.0-rc.5: 2024-05-29
  • 1.0.0-rc.6: 2024-06-19
  • 1.0.0-rc.7: 2024-06-25

New Features

  • Introduce PrimaryKeyArity with ARITY constant SeaQL#2185
fn get_arity_of<E: EntityTrait>() -> usize {
    E::PrimaryKey::iter().count() // before; runtime
    <<E::PrimaryKey as PrimaryKeyTrait>::ValueType as PrimaryKeyArity>::ARITY // now; compile-time
}
  • Associate ActiveModel to EntityTrait SeaQL#2186
  • [sea-orm-macros] Added rename_all attribute to DeriveEntityModel & DeriveActiveEnum SeaQL#2170
#[derive(DeriveEntityModel)]
#[sea_orm(table_name = "user", rename_all = "camelCase")]
pub struct Model {
    #[sea_orm(primary_key)]
    id: i32,
    first_name: String, // firstName
    #[sea_orm(column_name = "lAsTnAmE")]
    last_name: String, // lAsTnAmE
}

#[derive(EnumIter, DeriveActiveEnum)]
#[sea_orm(rs_type = "String", db_type = "String(StringLen::None)", rename_all = "camelCase")]
pub enum TestEnum {
    DefaultVariant, // defaultVariant
    #[sea_orm(rename = "kebab-case")]
    VariantKebabCase, // variant-kebab-case
    #[sea_orm(rename = "snake_case")]
    VariantSnakeCase, // variant_snake_case
    #[sea_orm(string_value = "CuStOmStRiNgVaLuE")]
    CustomStringValue, // CuStOmStRiNgVaLuE
}
// Remember to import `sea_orm_migration::schema::*`
use sea_orm_migration::{prelude::*, schema::*};

#[derive(DeriveMigrationName)]
pub struct Migration;

#[async_trait::async_trait]
impl MigrationTrait for Migration {
    async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
        manager
            .create_table(
                Table::create()
                    .table(Users::Table)
                    .if_not_exists()
                    .col(pk_auto(Users::Id)) // Primary key with auto-increment
                    .col(uuid(Users::Pid)) // UUID column
                    .col(string_uniq(Users::Email)) // String column with unique constraint
                    .col(string(Users::Password)) // String column
                    .col(string(Users::ApiKey).unique_key())
                    .col(string(Users::Name))
                    .col(string_null(Users::ResetToken)) // Nullable string column
                    .col(timestamp_null(Users::ResetSentAt)) // Nullable timestamp column
                    .col(string_null(Users::EmailVerificationToken))
                    .col(timestamp_null(Users::EmailVerificationSentAt))
                    .col(timestamp_null(Users::EmailVerifiedAt))
                    .to_owned(),
            )
            .await
    }

    // ...
}

Enhancements

  • Added non-TLS runtime SeaQL#2256
  • Added QuerySelect::tbl_col_as
  • Added Insert::on_conflict_do_nothing SeaQL#2244
  • Migration schema nullable column set NULL explicitly SeaQL#2255
  • Added ActiveValue::set_if_not_equals() SeaQL#2194
  • Added ActiveValue::try_as_ref() SeaQL#2197
  • Added QuerySelect::order_by_with_nulls SeaQL#2228
  • Expose get_xxx_connection_pool by default SeaQL#2233
  • Added QueryResult::column_names SeaQL#2148
  • [sea-orm-macro] Add @generated in generated code SeaQL#2199
  • [sea-orm-macro] Qualify traits in DeriveActiveModel macro SeaQL#1665
  • [sea-orm-cli] Fix migrate generate on empty mod.rs files SeaQL#2064
  • DerivePartialModel macro attribute entity now supports syn::Type SeaQL#2137
#[derive(DerivePartialModel)]
#[sea_orm(entity = "<entity::Model as ModelTrait>::Entity")]
struct EntityNameNotAIdent {
    #[sea_orm(from_col = "foo2")]
    _foo: i32,
    #[sea_orm(from_col = "bar2")]
    _bar: String,
}
let cf = Alias::new("cf");

assert_eq!(
    cake::Entity::find()
        .join_as(
            JoinType::LeftJoin,
            cake_filling::Relation::Cake.def().rev(),
            cf.clone()
        )
        .join(
            JoinType::LeftJoin,
            cake_filling::Relation::Filling.def().from_alias(cf)
        )
        .build(DbBackend::MySql)
        .to_string(),
    [
        "SELECT `cake`.`id`, `cake`.`name` FROM `cake`",
        "LEFT JOIN `cake_filling` AS `cf` ON `cake`.`id` = `cf`.`cake_id`",
        "LEFT JOIN `filling` ON `cf`.`filling_id` = `filling`.`id`",
    ]
    .join(" ")
);

Bug Fixes

  • Set schema search path in Postgres without enclosing single quote SeaQL#2241
  • [sea-orm-cli] Generate has_one relation for foreign key of unique index / constraint SeaQL#2254

Breaking changes

  • Renamed ConnectOptions::pool_options() to ConnectOptions::sqlx_pool_options() SeaQL#2145
  • Made sqlx_common private, hiding sqlx_error_to_xxx_err SeaQL#2145
  • Rework SQLite type mappings SeaQL#2077, SeaQL#2078

Upgrades

  • Upgrade time to 0.3.36 SeaQL#2267
  • Upgrade strum to 0.26 SeaQL#2088
  • Upgrade sea-schema to 0.15.0
  • Upgrade sea-query-binder to 0.6.0
  • Upgrade sea-query to 0.31.0

House keeping

  • Reduce warnings in integration tests SeaQL#2177
  • Improved Actix example to return 404 not found on unexpected inputs SeaQL#2140
  • Re-enable rocket_okapi example SeaQL#2136

1.0.0-rc.7 - 2024-06-25

Upgrades

1.0.0-rc.6 - 2024-06-19

Enhancements

  • Added non-TLS runtime SeaQL#2256
  • Added QuerySelect::tbl_col_as
  • Added Insert::on_conflict_do_nothing SeaQL#2244
  • Migration schema nullable column set NULL explicitly SeaQL#2255

Bug Fixes

  • Set schema search path in Postgres without enclosing single quote SeaQL#2241
  • [sea-orm-cli] Generate has_one relation for foreign key of unique index / constraint SeaQL#2254

1.0.0-rc.5 - 2024-05-29

New Features

  • Introduce PrimaryKeyArity with ARITY constant SeaQL#2185
fn get_arity_of<E: EntityTrait>() -> usize {
    E::PrimaryKey::iter().count() // before; runtime
    <<E::PrimaryKey as PrimaryKeyTrait>::ValueType as PrimaryKeyArity>::ARITY // now; compile-time
}
  • Associate ActiveModel to EntityTrait SeaQL#2186
  • [sea-orm-macros] Added rename_all attribute to DeriveEntityModel & DeriveActiveEnum SeaQL#2170
#[derive(DeriveEntityModel)]
#[sea_orm(table_name = "user", rename_all = "camelCase")]
pub struct Model {
    #[sea_orm(primary_key)]
    id: i32,
    first_name: String, // firstName
    #[sea_orm(column_name = "lAsTnAmE")]
    last_name: String, // lAsTnAmE
}

#[derive(EnumIter, DeriveActiveEnum)]
#[sea_orm(rs_type = "String", db_type = "String(StringLen::None)", rename_all = "camelCase")]
pub enum TestEnum {
    DefaultVariant, // defaultVariant
    #[sea_orm(rename = "kebab-case")]
    VariantKebabCase, // variant-kebab-case
    #[sea_orm(rename = "snake_case")]
    VariantSnakeCase, // variant_snake_case
    #[sea_orm(string_value = "CuStOmStRiNgVaLuE")]
    CustomStringValue, // CuStOmStRiNgVaLuE
}

Enhancements

1.0.0-rc.4 - 2024-05-13

Enhancements

  • Added QueryResult::column_names SeaQL#2148
  • [sea-orm-macro] Add @generated in generated code SeaQL#2199

Upgrades

  • Upgrade sea-query to 0.31.0-rc.6
  • Upgrade sea-schema to 0.15.0-rc.6

House Keeping

1.0.0-rc.3 - 2024-03-26

Enhancements

  • [sea-orm-macro] Qualify traits in DeriveActiveModel macro SeaQL#1665

1.0.0-rc.2 - 2024-03-15

Breaking Changes

  • Renamed ConnectOptions::pool_options() to ConnectOptions::sqlx_pool_options() SeaQL#2145
  • Made sqlx_common private, hiding sqlx_error_to_xxx_err SeaQL#2145

Enhancements

  • [sea-orm-cli] Fix migrate generate on empty mod.rs files SeaQL#2064
  • DerivePartialModel macro attribute entity now supports syn::Type SeaQL#2137
#[derive(DerivePartialModel)]
#[sea_orm(entity = "<entity::Model as ModelTrait>::Entity")]
struct EntityNameNotAIdent {
    #[sea_orm(from_col = "foo2")]
    _foo: i32,
    #[sea_orm(from_col = "bar2")]
    _bar: String,
}
let cf = Alias::new("cf");

assert_eq!(
    cake::Entity::find()
        .join_as(
            JoinType::LeftJoin,
            cake_filling::Relation::Cake.def().rev(),
            cf.clone()
        )
        .join(
            JoinType::LeftJoin,
            cake_filling::Relation::Filling.def().from_alias(cf)
        )
        .build(DbBackend::MySql)
        .to_string(),
    [
        "SELECT `cake`.`id`, `cake`.`name` FROM `cake`",
        "LEFT JOIN `cake_filling` AS `cf` ON `cake`.`id` = `cf`.`cake_id`",
        "LEFT JOIN `filling` ON `cf`.`filling_id` = `filling`.`id`",
    ]
    .join(" ")
);

Upgrades

  • Upgrade sea-schema to 0.15.0-rc.3
  • Upgrade strum to 0.26 SeaQL#2088

House keeping

  • Improved Actix example to return 404 not found on unexpected inputs SeaQL#2140
  • Re-enable rocket_okapi example SeaQL#2136

1.0.0-rc.1 - 2024-02-06

New Features

// Remember to import `sea_orm_migration::schema::*`
use sea_orm_migration::{prelude::*, schema::*};

#[derive(DeriveMigrationName)]
pub struct Migration;

#[async_trait::async_trait]
impl MigrationTrait for Migration {
    async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
        manager
            .create_table(
                Table::create()
                    .table(Users::Table)
                    .if_not_exists()
                    .col(pk_auto(Users::Id)) // Primary key with auto-increment
                    .col(uuid(Users::Pid)) // UUID column
                    .col(string_uniq(Users::Email)) // String column with unique constraint
                    .col(string(Users::Password)) // String column
                    .col(string(Users::ApiKey).unique_key())
                    .col(string(Users::Name))
                    .col(string_null(Users::ResetToken)) // Nullable string column
                    .col(timestamp_null(Users::ResetSentAt)) // Nullable timestamp column
                    .col(string_null(Users::EmailVerificationToken))
                    .col(timestamp_null(Users::EmailVerificationSentAt))
                    .col(timestamp_null(Users::EmailVerifiedAt))
                    .to_owned(),
            )
            .await
    }

    // ...
}

Breaking Changes

0.12.14 - 2024-02-05

  • Added feature flag sqlite-use-returning-for-3_35 to use SQLite's returning SeaQL#2070
  • Added Loco example SeaQL#2092

0.12.12 - 2024-01-22

Bug Fixes

  • [sea-orm-cli] Fix entity generation for non-alphanumeric enum variants SeaQL#1821
  • [sea-orm-cli] Fix entity generation for relations with composite keys SeaQL#2071

Enhancements

  • Added ConnectOptions::test_before_acquire

0.12.11 - 2024-01-14

New Features

Enhancements

  • Improve query performance of Paginator's COUNT query SeaQL#2030
  • Added SQLx slow statements logging to ConnectOptions SeaQL#2055
  • Added QuerySelect::lock_with_behavior SeaQL#1867

Bug Fixes

  • [sea-orm-macro] Qualify types in DeriveValueType macro SeaQL#2054

House keeping

0.12.10 - 2023-12-14

New Features

  • [sea-orm-macro] Comment attribute for Entity (#[sea_orm(comment = "action")]); create_table_from_entity supports comment SeaQL#2009
  • Added "proxy" (feature flag proxy) to database backend SeaQL#1881, SeaQL#2000

Enhancements

Upgrades

0.12.9 - 2023-12-08

Enhancements

Upgrades

0.12.8 - 2023-12-04

Enhancements

  • Implement StatementBuilder for sea_query::WithQuery SeaQL#1960

Upgrades

0.12.7 - 2023-11-22

Enhancements

  • Added method expr_as_ that accepts self SeaQL#1979

Upgrades

0.12.6 - 2023-11-13

New Features

  • Added #[sea_orm(skip)] for FromQueryResult derive macro SeaQL#1954

0.12.5 - 2023-11-12

Bug Fixes

  • [sea-orm-cli] Fix duplicated active enum use statements on generated entities SeaQL#1953
  • [sea-orm-cli] Added --enum-extra-derives SeaQL#1934
  • [sea-orm-cli] Added --enum-extra-attributes SeaQL#1952

0.12.4 - 2023-10-19

New Features

  • Add support for root JSON arrays SeaQL#1898 Now the following works (requires the json-array / postgres-array feature)!
#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
#[sea_orm(table_name = "json_struct_vec")]
pub struct Model {
    #[sea_orm(primary_key)]
    pub id: i32,
    #[sea_orm(column_type = "Json")]
    pub struct_vec: Vec<JsonColumn>,
}

#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, FromJsonQueryResult)]
pub struct JsonColumn {
    pub value: String,
}

Enhancements

Upgrades

0.12.3 - 2023-09-22

New Features

Enhancements

  • [sea-orm-cli] Support generation of related entity with composite foreign key SeaQL#1693

Bug Fixes

  • [sea-orm-macro] Fixed DeriveValueType by qualifying QueryResult SeaQL#1855
  • Fixed Loader panic on empty inputs

Upgrades

  • Upgraded salvo to 0.50
  • Upgraded chrono to 0.4.30 SeaQL#1858
  • Updated sea-query to 0.30.1
  • Updated sea-schema to 0.14.1

House keeping

  • Added test cases for find_xxx_related/linked SeaQL#1811

0.12.2 - 2023-08-04

Enhancements

  • Added support for Postgres arrays in FromQueryResult impl of JsonValue SeaQL#1598

Bug fixes

  • Fixed find_with_related consolidation logic SeaQL#1800

0.12.1 - 2023-07-27

  • 0.12.0-rc.1: Yanked
  • 0.12.0-rc.2: 2023-05-19
  • 0.12.0-rc.3: 2023-06-22
  • 0.12.0-rc.4: 2023-07-08
  • 0.12.0-rc.5: 2023-07-22

New Features

  • Added MigratorTrait::migration_table_name() method to configure the name of migration table SeaQL#1511
#[async_trait::async_trait]
impl MigratorTrait for Migrator {
    // Override the name of migration table
    fn migration_table_name() -> sea_orm::DynIden {
        Alias::new("override_migration_table_name").into_iden()
    }
    ...
}
  • Added option to construct chained AND / OR join on condition SeaQL#1433
#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
#[sea_orm(table_name = "cake")]
pub struct Model {
    #[sea_orm(primary_key)]
    pub id: i32,
    pub name: String,
}

#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {
    // By default, it's
    // `JOIN `fruit` ON `cake`.`id` = `fruit`.`cake_id` AND `fruit`.`name` LIKE '%tropical%'`
    #[sea_orm(
        has_many = "super::fruit::Entity",
        on_condition = r#"super::fruit::Column::Name.like("%tropical%")"#
    )]
    TropicalFruit,
    // Or specify `condition_type = "any"` to override it,
    // `JOIN `fruit` ON `cake`.`id` = `fruit`.`cake_id` OR `fruit`.`name` LIKE '%tropical%'`
    #[sea_orm(
        has_many = "super::fruit::Entity",
        on_condition = r#"super::fruit::Column::Name.like("%tropical%")"#
        condition_type = "any",
    )]
    OrTropicalFruit,
}
  • Supports entity with composite primary key of arity 12 SeaQL#1508
    • Identity supports tuple of DynIden with arity up to 12
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
#[sea_orm(table_name = "primary_key_of_12")]
pub struct Model {
    #[sea_orm(primary_key, auto_increment = false)]
    pub id_1: String,
    ...
    #[sea_orm(primary_key, auto_increment = false)]
    pub id_12: bool,
}
#[derive(DerivePartialModel, FromQueryResult)]
#[sea_orm(entity = "Cake")]
struct PartialCake {
    name: String,
    #[sea_orm(
        from_expr = r#"SimpleExpr::FunctionCall(Func::upper(Expr::col((Cake, cake::Column::Name))))"#
    )]
    name_upper: String,
}

assert_eq!(
    cake::Entity::find()
        .into_partial_model::<PartialCake>()
        .into_statement(DbBackend::Sqlite)
        .to_string(),
    r#"SELECT "cake"."name", UPPER("cake"."name") AS "name_upper" FROM "cake""#
);
  • Added DbErr::sql_err() method to convert error into common database errors SqlErr, such as unique constraint or foreign key violation errors. SeaQL#1707
assert!(matches!(
    cake.into_active_model().insert(db).await
        .expect_err("Insert a row with duplicated primary key")
        .sql_err(),
    Some(SqlErr::UniqueConstraintViolation(_))
));

assert!(matches!(
    fk_cake.insert(db).await
        .expect_err("Insert a row with invalid foreign key")
        .sql_err(),
    Some(SqlErr::ForeignKeyConstraintViolation(_))
));
fn find_with_related<R>(self, r: R) -> SelectTwoMany<E, R>
    where R: EntityTrait, E: Related<R>;
fn find_with_linked<L, T>(self, l: L) -> SelectTwoMany<E, T>
    where L: Linked<FromEntity = E, ToEntity = T>, T: EntityTrait;

// boths yields `Vec<(E::Model, Vec<F::Model>)>`
  • Added DeriveValueType derive macro for custom wrapper types, implementations of the required traits will be provided, you can customize the column_type and array_type if needed SeaQL#1720
#[derive(DeriveValueType)]
#[sea_orm(array_type = "Int")]
pub struct Integer(i32);

#[derive(DeriveValueType)]
#[sea_orm(column_type = "Boolean", array_type = "Bool")]
pub struct Boolbean(pub String);

#[derive(DeriveValueType)]
pub struct StringVec(pub Vec<String>);
  • Added DeriveDisplay derive macro to implements std::fmt::Display for enum SeaQL#1726
#[derive(DeriveDisplay)]
enum DisplayTea {
    EverydayTea,
    #[sea_orm(display_value = "Breakfast Tea")]
    BreakfastTea,
}
assert_eq!(format!("{}", DisplayTea::EverydayTea), "EverydayTea");
assert_eq!(format!("{}", DisplayTea::BreakfastTea), "Breakfast Tea");
  • Added UpdateMany::exec_with_returning() SeaQL#1677
let models: Vec<Model> = Entity::update_many()
    .col_expr(Column::Values, Expr::expr(..))
    .exec_with_returning(db)
    .await?;
  • Supporting default_expr in DeriveEntityModel SeaQL#1474
#[derive(DeriveEntityModel)]
#[sea_orm(table_name = "hello")]
pub struct Model {
    #[sea_orm(default_expr = "Expr::current_timestamp()")]
    pub timestamp: DateTimeUtc,
}

assert_eq!(
    Column::Timestamp.def(),
    ColumnType::TimestampWithTimeZone.def()
        .default(Expr::current_timestamp())
);
enum DbErr {
    ConnectionAcquire(ConnAcquireErr),
    ..
}

enum ConnAcquireErr {
    Timeout,
    ConnectionClosed,
}

Seaography

Added Seaography integration SeaQL#1599

  • Added DeriveEntityRelated macro which will implement seaography::RelationBuilder for RelatedEntity enumeration when the seaography feature is enabled

  • Added generation of seaography related information to sea-orm-codegen.

    The RelatedEntity enum is added in entities files by sea-orm-cli when flag seaography is set:

/// SeaORM Entity
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelatedEntity)]
pub enum RelatedEntity {
    #[sea_orm(entity = "super::bakery::Entity")]
    Bakery,
    #[sea_orm(entity = "super::cake_baker::Entity")]
    CakeBaker,
    #[sea_orm(entity = "super::cake::Entity")]
    Cake,
}

Enhancements

  • Supports for partial select of Option<T> model field. A None value will be filled when the select result does not contain the Option<T> field without throwing an error. SeaQL#1513
  • [sea-orm-cli] the migrate init command will create a .gitignore file when the migration folder reside in a Git repository SeaQL#1334
  • [sea-orm-cli] Added support for generating migration of space separated name, for example executing sea-orm-cli migrate generate "create accounts table" command will create m20230503_000000_create_accounts_table.rs for you SeaQL#1570
  • Added Migration::name() and Migration::status() getters for the name and status of sea_orm_migration::Migration SeaQL#1519
let migrations = Migrator::get_pending_migrations(db).await?;
assert_eq!(migrations.len(), 5);

let migration = migrations.get(0).unwrap();
assert_eq!(migration.name(), "m20220118_000002_create_fruit_table");
assert_eq!(migration.status(), MigrationStatus::Pending);
  • The postgres-array feature will be enabled when sqlx-postgres backend is selected SeaQL#1565
  • Replace String parameters in API with Into<String> SeaQL#1439
    • Implements IntoMockRow for any BTreeMap that is indexed by string impl IntoMockRow for BTreeMap<T, Value> where T: Into<String>
    • Converts any string value into ConnectOptions - impl From<T> for ConnectOptions where T: Into<String>
    • Changed the parameter of method ConnectOptions::new(T) where T: Into<String> to takes any string SQL
    • Changed the parameter of method Statement::from_string(DbBackend, T) where T: Into<String> to takes any string SQL
    • Changed the parameter of method Statement::from_sql_and_values(DbBackend, T, I) where I: IntoIterator<Item = Value>, T: Into<String> to takes any string SQL
    • Changed the parameter of method Transaction::from_sql_and_values(DbBackend, T, I) where I: IntoIterator<Item = Value>, T: Into<String> to takes any string SQL
    • Changed the parameter of method ConnectOptions::set_schema_search_path(T) where T: Into<String> to takes any string
    • Changed the parameter of method ColumnTrait::like(), ColumnTrait::not_like(), ColumnTrait::starts_with(), ColumnTrait::ends_with() and ColumnTrait::contains() to takes any string
  • Added sea_query::{DynIden, RcOrArc, SeaRc} to entity prelude SeaQL#1661
  • Added expr, exprs and expr_as methods to QuerySelect trait SeaQL#1702
  • Added DatabaseConnection::ping SeaQL#1627
|db: DatabaseConnection| {
    assert!(db.ping().await.is_ok());
    db.clone().close().await;
    assert!(matches!(db.ping().await, Err(DbErr::ConnectionAcquire)));
}
  • Added TryInsert that does not panic on empty inserts SeaQL#1708
// now, you can do:
let res = Bakery::insert_many(std::iter::empty())
    .on_empty_do_nothing()
    .exec(db)
    .await;

assert!(matches!(res, Ok(TryInsertResult::Empty)));
  • Insert on conflict do nothing to return Ok SeaQL#1712
let on = OnConflict::column(Column::Id).do_nothing().to_owned();

// Existing behaviour
let res = Entity::insert_many([..]).on_conflict(on).exec(db).await;
assert!(matches!(res, Err(DbErr::RecordNotInserted)));

// New API; now you can:
let res =
Entity::insert_many([..]).on_conflict(on).do_nothing().exec(db).await;
assert!(matches!(res, Ok(TryInsertResult::Conflicted)));

Bug Fixes

  • Fixed DeriveActiveEnum throwing errors because string_value consists non-UAX#31 compliant characters SeaQL#1374
#[derive(EnumIter, DeriveActiveEnum)]
#[sea_orm(rs_type = "String", db_type = "String(None)")]
pub enum StringValue {
    #[sea_orm(string_value = "")]
    Member1,
    #[sea_orm(string_value = "$$")]
    Member2,
}
// will now produce the following enum:
pub enum StringValueVariant {
    __Empty,
    _0x240x24,
}
  • [sea-orm-cli] Fix Postgres enum arrays SeaQL#1678
  • [sea-orm-cli] The implementation of Related<R> with via and to methods will not be generated if there exists multiple paths via an intermediate table SeaQL#1435
  • [sea-orm-cli] fixed entity generation includes partitioned tables SeaQL#1582, SeaQL/sea-schema#105
  • Fixed ActiveEnum::db_type() return type does not implement ColumnTypeTrait SeaQL#1576
  • Resolved insert_many failing if the models iterator is empty SeaQL#873

Breaking changes

  • Supports for partial select of Option<T> model field. A None value will be filled when the select result does not contain the Option<T> field instead of throwing an error. SeaQL#1513
  • Replaced sea-strum dependency with upstream strum in sea-orm SeaQL#1535
    • Added derive and strum features to sea-orm-macros
    • The derive macro EnumIter is now shipped by sea-orm-macros
  • Added a new variant Many to Identity SeaQL#1508
  • Enabled hashable-value feature in SeaQuery, thus Value::Float(NaN) == Value::Float(NaN) would be true SeaQL#1728, SeaQL#1743
  • The DeriveActiveEnum derive macro no longer implement std::fmt::Display. You can use the new DeriveDisplay macro SeaQL#1726
  • sea-query/derive is no longer enabled by sea-orm, as such, Iden no longer works as a derive macro (it's still a trait). Instead, we are shipping a new macro DeriveIden SeaQL#1740 SeaQL#1755
// then:

#[derive(Iden)]
#[iden = "category"]
pub struct CategoryEnum;

#[derive(Iden)]
pub enum Tea {
    Table,
    #[iden = "EverydayTea"]
    EverydayTea,
}

// now:

#[derive(DeriveIden)]
#[sea_orm(iden = "category")]
pub struct CategoryEnum;

#[derive(DeriveIden)]
pub enum Tea {
    Table,
    #[sea_orm(iden = "EverydayTea")]
    EverydayTea,
}
  • Definition of DbErr::ConnectionAcquire changed to ConnectionAcquire(ConnAcquireErr) SeaQL#1737
  • FromJsonQueryResult removed from entity prelude

Upgrades

House keeping

Full Changelog: https://github.com/SeaQL/sea-orm/compare/0.11.1...0.12.1

0.11.3 - 2023-04-24

Enhancements

  • Re-export sea_orm::ConnectionTrait in sea_orm_migration::prelude SeaQL#1577
  • Support generic structs in FromQueryResult derive macro SeaQL#1464, SeaQL#1603
#[derive(FromQueryResult)]
struct GenericTest<T: TryGetable> {
    foo: i32,
    bar: T,
}
trait MyTrait {
    type Item: TryGetable;
}

#[derive(FromQueryResult)]
struct TraitAssociateTypeTest<T>
where
    T: MyTrait,
{
    foo: T::Item,
}

Bug Fixes

0.11.2 - 2023-03-25

Enhancements

  • Enable required syn features SeaQL#1556
  • Re-export sea_query::BlobSize in sea_orm::entity::prelude SeaQL#1548

0.11.1 - 2023-03-10

Bug Fixes

  • Fixes DeriveActiveEnum (by qualifying ColumnTypeTrait::def) SeaQL#1478
  • The CLI command sea-orm-cli generate entity -u '<DB-URL>' will now generate the following code for each Binary or VarBinary columns in compact format SeaQL#1529
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)]
#[sea_orm(table_name = "binary")]
pub struct Model {
    #[sea_orm(primary_key)]
    pub id: i32,
    #[sea_orm(column_type = "Binary(BlobSize::Blob(None))")]
    pub binary: Vec<u8>,
    #[sea_orm(column_type = "Binary(BlobSize::Blob(Some(10)))")]
    pub binary_10: Vec<u8>,
    #[sea_orm(column_type = "Binary(BlobSize::Tiny)")]
    pub binary_tiny: Vec<u8>,
    #[sea_orm(column_type = "Binary(BlobSize::Medium)")]
    pub binary_medium: Vec<u8>,
    #[sea_orm(column_type = "Binary(BlobSize::Long)")]
    pub binary_long: Vec<u8>,
    #[sea_orm(column_type = "VarBinary(10)")]
    pub var_binary: Vec<u8>,
}
  • The CLI command sea-orm-cli generate entity -u '<DB-URL>' --expanded-format will now generate the following code for each Binary or VarBinary columns in expanded format SeaQL#1529
impl ColumnTrait for Column {
    type EntityName = Entity;
    fn def(&self) -> ColumnDef {
        match self {
            Self::Id => ColumnType::Integer.def(),
            Self::Binary => ColumnType::Binary(sea_orm::sea_query::BlobSize::Blob(None)).def(),
            Self::Binary10 => {
                ColumnType::Binary(sea_orm::sea_query::BlobSize::Blob(Some(10u32))).def()
            }
            Self::BinaryTiny => ColumnType::Binary(sea_orm::sea_query::BlobSize::Tiny).def(),
            Self::BinaryMedium => ColumnType::Binary(sea_orm::sea_query::BlobSize::Medium).def(),
            Self::BinaryLong => ColumnType::Binary(sea_orm::sea_query::BlobSize::Long).def(),
            Self::VarBinary => ColumnType::VarBinary(10u32).def(),
        }
    }
}

0.11.0 - 2023-02-07

  • 2023-02-02: 0.11.0-rc.1
  • 2023-02-04: 0.11.0-rc.2

New Features

SeaORM Core

  • Simple data loader SeaQL#1238, SeaQL#1443
  • Transactions Isolation level and Access mode SeaQL#1230
  • Support various UUID formats that are available in uuid::fmt module SeaQL#1325
  • Support Vector of enum for Postgres SeaQL#1210
  • Support ActiveEnum field as primary key SeaQL#1414
  • Casting columns as a different data type on select, insert and update SeaQL#1304
  • Methods of ActiveModelBehavior receive db connection as a parameter SeaQL#1145, SeaQL#1328
  • Added execute_unprepared method to DatabaseConnection and DatabaseTransaction SeaQL#1327
  • Added Select::into_tuple to select rows as tuples (instead of defining a custom Model) SeaQL#1311

SeaORM CLI

SeaORM Migration

  • Migrations are now performed inside a transaction for Postgres SeaQL#1379

Enhancements

  • Refactor schema module to expose functions for database alteration SeaQL#1256
  • Generate compact entity with #[sea_orm(column_type = "JsonBinary")] macro attribute SeaQL#1346
  • MockDatabase::append_exec_results(), MockDatabase::append_query_results(), MockDatabase::append_exec_errors() and MockDatabase::append_query_errors() take any types implemented IntoIterator trait SeaQL#1367
  • find_by_id and delete_by_id take any Into primary key value SeaQL#1362
  • QuerySelect::offset and QuerySelect::limit takes in Into<Option<u64>> where None would reset them SeaQL#1410
  • Added DatabaseConnection::close SeaQL#1236
  • Added is_null getter for ColumnDef SeaQL#1381
  • Added ActiveValue::reset to convert Unchanged into Set SeaQL#1177
  • Added QueryTrait::apply_if to optionally apply a filter SeaQL#1415
  • Added the sea-orm-internal feature flag to expose some SQLx types
    • Added DatabaseConnection::get_*_connection_pool() for accessing the inner SQLx connection pool SeaQL#1297
    • Re-exporting SQLx errors SeaQL#1434

Upgrades

House Keeping

Bug Fixes

  • [sea-orm-cli] Propagate error on the spawned child processes SeaQL#1402
    • Fixes sea-orm-cli errors exit with error code 0 SeaQL#1342
  • Fixes DeriveColumn (by qualifying IdenStatic::as_str) SeaQL#1280
  • Prevent returning connections to pool with a positive transaction depth SeaQL#1283
  • Postgres insert many will throw RecordNotInserted error if non of them are being inserted SeaQL#1021
    • Fixes inserting active models by insert_many with on_conflict and do_nothing panics if no rows are inserted on Postgres SeaQL#899
  • Don't call last_insert_id if not needed SeaQL#1403
    • Fixes hitting 'negative last_insert_rowid' panic with Sqlite SeaQL#1357
  • Noop when update without providing any values SeaQL#1384
    • Fixes Syntax Error when saving active model that sets nothing SeaQL#1376

Breaking Changes

  • [sea-orm-cli] Enable --universal-time by default SeaQL#1420
  • Added RecordNotInserted and RecordNotUpdated to DbErr
  • Added ConnectionTrait::execute_unprepared method SeaQL#1327
  • As part of SeaQL#1311, the required method of TryGetable changed:
// then
fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result<Self, TryGetError>;
// now; ColIdx can be `&str` or `usize`
fn try_get_by<I: ColIdx>(res: &QueryResult, index: I) -> Result<Self, TryGetError>;

So if you implemented it yourself:

impl TryGetable for XXX {
-   fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result<Self, TryGetError> {
+   fn try_get_by<I: sea_orm::ColIdx>(res: &QueryResult, idx: I) -> Result<Self, TryGetError> {
-       let value: YYY = res.try_get(pre, col).map_err(TryGetError::DbErr)?;
+       let value: YYY = res.try_get_by(idx).map_err(TryGetError::DbErr)?;
        ..
    }
}
  • The ActiveModelBehavior trait becomes async trait SeaQL#1328. If you overridden the default ActiveModelBehavior implementation:
#[async_trait::async_trait]
impl ActiveModelBehavior for ActiveModel {
    async fn before_save<C>(self, db: &C, insert: bool) -> Result<Self, DbErr>
    where
        C: ConnectionTrait,
    {
        // ...
    }

    // ...
}
  • DbErr::RecordNotFound("None of the database rows are affected") is moved to a dedicated error variant DbErr::RecordNotUpdated SeaQL#1425
let res = Update::one(cake::ActiveModel {
        name: Set("Cheese Cake".to_owned()),
        ..model.into_active_model()
    })
    .exec(&db)
    .await;

// then
assert_eq!(
    res,
    Err(DbErr::RecordNotFound(
        "None of the database rows are affected".to_owned()
    ))
);

// now
assert_eq!(res, Err(DbErr::RecordNotUpdated));
  • sea_orm::ColumnType was replaced by sea_query::ColumnType SeaQL#1395
    • Method ColumnType::def was moved to ColumnTypeTrait
    • ColumnType::Binary becomes a tuple variant which takes in additional option sea_query::BlobSize
    • ColumnType::Custom takes a sea_query::DynIden instead of String and thus a new method custom is added (note the lowercase)
// Compact Entity
#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
#[sea_orm(table_name = "fruit")]
pub struct Model {
-   #[sea_orm(column_type = r#"Custom("citext".to_owned())"#)]
+   #[sea_orm(column_type = r#"custom("citext")"#)]
    pub column: String,
}
// Expanded Entity
impl ColumnTrait for Column {
    type EntityName = Entity;

    fn def(&self) -> ColumnDef {
        match self {
-           Self::Column => ColumnType::Custom("citext".to_owned()).def(),
+           Self::Column => ColumnType::custom("citext").def(),
        }
    }
}

Miscellaneous

Full Changelog: https://github.com/SeaQL/sea-orm/compare/0.10.0...0.11.0

0.10.7 - 2023-01-19

Bug Fixes

  • Inserting active models by insert_many with on_conflict and do_nothing panics if no rows are inserted on Postgres SeaQL#899
  • Hitting 'negative last_insert_rowid' panic with Sqlite SeaQL#1357

0.10.6 - 2022-12-23

Enhancements

  • Cast enum values when constructing update many query SeaQL#1178

Bug Fixes

  • Fixes DeriveColumn (by qualifying IdenStatic::as_str) SeaQL#1280
  • Prevent returning connections to pool with a positive transaction depth SeaQL#1283
  • [sea-orm-codegen] Skip implementing Related if the same related entity is being referenced by a conjunct relation SeaQL#1298
  • [sea-orm-cli] CLI depends on codegen of the same version SeaQL#1299

0.10.5 - 2022-12-02

New Features

  • Add QuerySelect::columns method - select multiple columns SeaQL#1264
  • Transactions Isolation level and Access mode SeaQL#1230

Bug Fixes

  • DeriveEntityModel derive macro: when parsing field type, always treat field with Option<T> as nullable column SeaQL#1257

Enhancements

  • [sea-orm-cli] Generate Related implementation for many-to-many relation with extra columns SeaQL#1260
  • Optimize the default implementation of TryGetableFromJson::try_get_from_json() - deserializing into Self directly without the need of a intermediate serde_json::Value SeaQL#1249

0.10.4 - 2022-11-24

Bug Fixes

  • Fix DeriveActiveEnum expand enum variant starts with number SeaQL#1219
  • [sea-orm-cli] Generate entity file for specified tables only SeaQL#1245
  • Support appending DbErr to MockDatabase SeaQL#1241

Enhancements

  • Filter rows with IS IN enum values expression SeaQL#1183
  • [sea-orm-cli] Generate entity with relation variant order by name of reference table SeaQL#1229

0.10.3 - 2022-11-14

Bug Fixes

  • [sea-orm-cli] Set search path when initializing Postgres connection for CLI generate entity SeaQL#1212
  • [sea-orm-cli] Generate _ prefix to enum variant starts with number SeaQL#1211
  • Fix composite key cursor pagination SeaQL#1216
    • The logic for single-column primary key was correct, but for composite keys the logic was incorrect

Enhancements

House Keeping

0.10.2 - 2022-11-06

Enhancements

  • [sea-orm-rocket] added sqlx_logging to Config SeaQL#1192
  • Collecting metrics for query_one/all SeaQL#1165
  • Use GAT to elide StreamTrait lifetime SeaQL#1161

Bug Fixes

  • corrected the error name UpdateGetPrimaryKey SeaQL#1180

Upgrades

  • Update MSRV to 1.65

0.10.1 - 2022-10-27

Enhancements

  • [sea-orm-cli] Escape module name defined with Rust keywords SeaQL#1052
  • [sea-orm-cli] Check to make sure migration name doesn't contain hyphen - in it SeaQL#879, SeaQL#1155
  • Support time crate for SQLite SeaQL#995

Bug Fixes

  • [sea-orm-cli] Generate Related for m-to-n relation SeaQL#1075
  • [sea-orm-cli] Generate model entity with Postgres Enum field SeaQL#1153
  • [sea-orm-cli] Migrate up command apply all pending migrations SeaQL#1010
  • [sea-orm-cli] Conflicting short flag -u when executing migrate generate command SeaQL#1157
  • Prefix the usage of types with sea_orm:: inside DeriveActiveEnum derive macros SeaQL#1146, SeaQL#1154
  • [sea-orm-cli] Generate model with Vec<f32> or Vec<f64> should not derive Eq on the model struct SeaQL#1158

House Keeping

  • [sea-orm-cli] [sea-orm-migration] Add cli feature to optionally include dependencies that are required by the CLI SeaQL#978

Upgrades

0.10.0 - 2022-10-23

New Features

  • Better error types (carrying SQLx Error) SeaQL#1002
  • Support array datatype in PostgreSQL SeaQL#1132
  • [sea-orm-cli] Generate entity files as a library or module SeaQL#953
  • [sea-orm-cli] Generate a new migration template with name prefix of unix timestamp SeaQL#947
  • [sea-orm-cli] Generate migration in modules SeaQL#933
  • [sea-orm-cli] Generate DeriveRelation on empty Relation enum SeaQL#1019
  • [sea-orm-cli] Generate entity derive Eq if possible SeaQL#988
  • [sea-orm-cli] Run migration on any PostgreSQL schema SeaQL#1056

Enhancements

  • Support distinct & distinct_on expression SeaQL#902
  • fn column() also handle enum type SeaQL#973
  • Added acquire_timeout on ConnectOptions SeaQL#897
  • [sea-orm-cli] migrate fresh command will drop all PostgreSQL types SeaQL#864, SeaQL#991
  • Better compile error for entity without primary key SeaQL#1020
  • Added blanket implementations of IntoActiveValue for Option values SeaQL#833
  • Added into_model & into_json to Cursor SeaQL#1112
  • Added set_schema_search_path method to ConnectOptions for setting schema search path of PostgreSQL connection SeaQL#1056
  • Serialize time types as serde_json::Value SeaQL#1042
  • Implements fmt::Display for ActiveEnum SeaQL#986
  • Implements TryFrom<ActiveModel> for Model SeaQL#990

Bug Fixes

Breaking Changes

  • Replaced usize with u64 in PaginatorTrait SeaQL#789
  • Type signature of DbErr changed as a result of SeaQL#1002
  • ColumnType::Enum structure changed:
enum ColumnType {
    // then
    Enum(String, Vec<String>)

    // now
    Enum {
        /// Name of enum
        name: DynIden,
        /// Variants of enum
        variants: Vec<DynIden>,
    }
    ...
}

// example

#[derive(Iden)]
enum TeaEnum {
    #[iden = "tea"]
    Enum,
    #[iden = "EverydayTea"]
    EverydayTea,
    #[iden = "BreakfastTea"]
    BreakfastTea,
}

// then
ColumnDef::new(active_enum_child::Column::Tea)
    .enumeration("tea", vec!["EverydayTea", "BreakfastTea"])

// now
ColumnDef::new(active_enum_child::Column::Tea)
    .enumeration(TeaEnum::Enum, [TeaEnum::EverydayTea, TeaEnum::BreakfastTea])
  • A new method array_type was added to ValueType:
impl sea_orm::sea_query::ValueType for MyType {
    fn array_type() -> sea_orm::sea_query::ArrayType {
        sea_orm::sea_query::ArrayType::TypeName
    }
    ...
}
  • ActiveEnum::name() changed return type to DynIden:
#[derive(Debug, Iden)]
#[iden = "category"]
pub struct CategoryEnum;

impl ActiveEnum for Category {
    // then
    fn name() -> String {
        "category".to_owned()
    }

    // now
    fn name() -> DynIden {
        SeaRc::new(CategoryEnum)
    }
    ...
}

House Keeping

Integration

Upgrades

Full Changelog: https://github.com/SeaQL/sea-orm/compare/0.9.0...0.10.0

0.9.3 - 2022-09-30

Enhancements

Bug Fixes

  • Implement IntoActiveValue for time types SeaQL#1041
  • Fixed module import for FromJsonQueryResult derive macro SeaQL#1081

0.9.2 - 2022-08-20

Enhancements

  • [sea-orm-cli] Migrator CLI handles init and generate commands SeaQL#931
  • [sea-orm-cli] added with-copy-enums flag to conditional derive Copy on ActiveEnum SeaQL#936

House Keeping

  • Exclude chrono default features SeaQL#950
  • Set minimal rustc version to 1.60 SeaQL#938
  • Update sea-query to 0.26.3

Notes

In this minor release, we removed time v0.1 from the dependency graph

0.9.1 - 2022-07-22

Enhancements

  • [sea-orm-cli] Codegen support for VarBinary column type SeaQL#746
  • [sea-orm-cli] Generate entity for SYSTEM VERSIONED tables on MariaDB SeaQL#876

Bug Fixes

  • RelationDef & RelationBuilder should be Send & Sync SeaQL#898

House Keeping

0.9.0 - 2022-07-17

New Features

  • Cursor pagination SeaQL#822
  • Custom join on conditions SeaQL#793
  • DeriveMigrationName and sea_orm_migration::util::get_file_stem SeaQL#736
  • FromJsonQueryResult for deserializing Json from query result SeaQL#794

Enhancements

  • Added sqlx_logging_level to ConnectOptions SeaQL#800
  • Added num_items_and_pages to Paginator SeaQL#768
  • Added TryFromU64 for time SeaQL#849
  • Added Insert::on_conflict SeaQL#791
  • Added QuerySelect::join_as and QuerySelect::join_as_rev SeaQL#852
  • Include column name in TryGetError::Null SeaQL#853
  • [sea-orm-cli] Improve logging SeaQL#735
  • [sea-orm-cli] Generate enum with numeric like variants SeaQL#588
  • [sea-orm-cli] Allow old pending migration to be applied SeaQL#755
  • [sea-orm-cli] Skip generating entity for ignored tables SeaQL#837
  • [sea-orm-cli] Generate code for time crate SeaQL#724
  • [sea-orm-cli] Add various blob column types SeaQL#850
  • [sea-orm-cli] Generate entity files with Postgres's schema name SeaQL#422

Upgrades

House Keeping

Bug Fixes

  • [sea-orm-cli] skip checking connection string for credentials SeaQL#851

Breaking Changes

  • SelectTwoMany::one() has been dropped SeaQL#813, you can get (Entity, Vec<RelatedEntity>) by first querying a single model from Entity, then use [ModelTrait::find_related] on the model.
  • Feature flag revamp

    We now adopt the weak dependency syntax in Cargo. That means the flags ["sqlx-json", "sqlx-chrono", "sqlx-decimal", "sqlx-uuid", "sqlx-time"] are not needed and now removed. Instead, with-time will enable sqlx?/time only if sqlx is already enabled. As a consequence, now the features with-json, with-chrono, with-rust_decimal, with-uuid, with-time will not be enabled as a side-effect of enabling sqlx.

Full Changelog: https://github.com/SeaQL/sea-orm/compare/0.8.0...0.9.0

sea-orm-migration 0.8.3

  • Removed async-std from dependency SeaQL#758

0.8.0 - 2022-05-10

New Features

  • [sea-orm-cli] sea migrate generate to generate a new, empty migration file SeaQL#656

Enhancements

Bug Fixes

  • Fix DerivePrimaryKey with custom primary key column name SeaQL#694
  • Fix DeriveEntityModel macros override column name SeaQL#695
  • Fix Insert with no value supplied using DEFAULT SeaQL#589

Breaking Changes

  • Migration utilities are moved from sea-schema to sea-orm repo, under a new sub-crate sea-orm-migration. sea_schema::migration::prelude should be replaced by sea_orm_migration::prelude in all migration files

Upgrades

  • Upgrade sea-query to 0.24.x, sea-schema to 0.8.x
  • Upgrade example to Actix Web 4, Actix Web 3 remains SeaQL#638
  • Added Tonic gRPC example SeaQL#659
  • Upgrade GraphQL example to use axum 0.5.x
  • Upgrade axum example to 0.5.x

Fixed Issues

  • Failed to insert row with only default values SeaQL#420
  • Reduce database connections to 1 during codegen SeaQL#511
  • Column names with single letters separated by underscores are concatenated SeaQL#630
  • Update Actix Web examples SeaQL#639
  • Lower function missing SeaQL#672
  • is_changed on active_model SeaQL#674
  • Failing find_with_related with column_name attribute SeaQL#693

Full Changelog: https://github.com/SeaQL/sea-orm/compare/0.7.1...0.8.0

0.7.1 - 2022-03-26

  • Fix sea-orm-cli error
  • Fix sea-orm cannot build without with-json

0.7.0 - 2022-03-26

New Features

  • Update ActiveModel by JSON by @billy1624 in SeaQL#492
  • Supports time crate by @billy1624 SeaQL#602
  • Allow for creation of indexes for PostgreSQL and SQLite @nickb937 SeaQL#593
  • Added delete_by_id @ShouvikGhosh2048 SeaQL#590
  • Implement PaginatorTrait for SelectorRaw @shinbunbun SeaQL#617

Enhancements

  • Added axum graphql example by @aaronleopold in SeaQL#587
  • Add example for integrate with jsonrpsee by @hunjixin SeaQL#632
  • Codegen add serde derives to enums, if specified by @BenJeau SeaQL#463
  • Codegen Unsigned Integer by @billy1624 SeaQL#397
  • Add Send bound to QueryStream and TransactionStream by @sebpuetz SeaQL#471
  • Add Send to StreamTrait by @nappa85 SeaQL#622
  • sea as an alternative bin name to sea-orm-cli by @ZhangHanDong SeaQL#558

Bug Fixes

  • Fix codegen with Enum in expanded format by @billy1624 SeaQL#624
  • Fixing and testing into_json of various field types by @billy1624 SeaQL#539

Breaking Changes

  • Exclude mock from default features by @billy1624 SeaQL#562
  • create_table_from_entity will no longer create index for MySQL, please use the new method create_index_from_entity

Documentations

  • Describe default value of ActiveValue on document by @Ken-Miura in SeaQL#556
  • community: add axum-book-management by @lz1998 in SeaQL#564
  • Add Backpack to project showcase by @JSH32 in SeaQL#567
  • Add mediarepo to showcase by @Trivernis in SeaQL#569
  • COMMUNITY: add a link to Svix to showcase by @tasn in SeaQL#537
  • Update COMMUNITY.md by @naryand in SeaQL#570
  • Update COMMUNITY.md by @BobAnkh in SeaQL#568
  • Update COMMUNITY.md by @KaniyaSimeji in SeaQL#566
  • Update COMMUNITY.md by @aaronleopold in SeaQL#565
  • Update COMMUNITY.md by @gudaoxuri in SeaQL#572
  • Update Wikijump's entry in COMMUNITY.md by @ammongit in SeaQL#573
  • Update COMMUNITY.md by @koopa1338 in SeaQL#574
  • Update COMMUNITY.md by @gengteng in SeaQL#580
  • Update COMMUNITY.md by @Yama-Tomo in SeaQL#582
  • add oura-postgres-sink to COMMUNITY.md by @rvcas in SeaQL#594
  • Add rust-example-caster-api to COMMUNITY.md by @bkonkle in SeaQL#623

Fixed Issues

  • orm-cli generated incorrect type for #[sea_orm(primary_key)]. Should be u64. Was i64. SeaQL#295
  • how to update dynamically from json value SeaQL#346
  • Make DatabaseConnection Clone with the default features enabled SeaQL#438
  • Updating multiple fields in a Model by passing a reference SeaQL#460
  • SeaORM CLI not adding serde derives to Enums SeaQL#461
  • sea-orm-cli generates wrong data type for nullable blob SeaQL#490
  • Support the time crate in addition (instead of?) chrono SeaQL#499
  • PaginatorTrait for SelectorRaw SeaQL#500
  • sea_orm::DatabaseConnection should implement Clone by default SeaQL#517
  • How do you seed data in migrations using ActiveModels? SeaQL#522
  • Datetime fields are not serialized by .into_json() on queries SeaQL#530
  • Update / Delete by id SeaQL#552
  • #[sea_orm(indexed)] only works for MySQL SeaQL#554
  • sea-orm-cli generate --with-serde does not work on Postgresql custom type SeaQL#581
  • sea-orm-cli generate --expanded-format panic when postgres table contains enum type SeaQL#614
  • UUID fields are not serialized by .into_json() on queries SeaQL#619

Full Changelog: https://github.com/SeaQL/sea-orm/compare/0.6.0...0.7.0

0.6.0 - 2022-02-07

New Features

  • Migration Support by @billy1624 in SeaQL#335
  • Support DateTime<Utc> & DateTime<Local> by @billy1624 in SeaQL#489
  • Add max_lifetime connection option by @billy1624 in SeaQL#493

Enhancements

  • Model with Generics by @billy1624 in SeaQL#400
  • Add Poem example by @sunli829 in SeaQL#446
  • Codegen column_name proc_macro attribute by @billy1624 in SeaQL#433
  • Easy joins with MockDatabase #447 by @cemoktra in SeaQL#455

Bug Fixes

  • CLI allow generate entity with url without password by @billy1624 in SeaQL#436
  • Support up to 6-ary composite primary key by @billy1624 in SeaQL#423
  • Fix FromQueryResult when Result is redefined by @tasn in SeaQL#495
  • Remove r# prefix when deriving FromQueryResult by @smrtrfszm in SeaQL#494

Breaking Changes

  • Name conflict of foreign key constraints when two entities have more than one foreign keys by @billy1624 in SeaQL#417

Fixed Issues

  • Is it possible to have 4 values Composite Key? SeaQL#352
  • Support DateTime<Utc> & DateTime<Local> SeaQL#381
  • Codegen column_name proc_macro attribute if column name isn't in snake case SeaQL#395
  • Model with Generics SeaQL#402
  • Foreign key constraint collision when multiple keys exist between the same two tables SeaQL#405
  • sea-orm-cli passwordless database user causes "No password was found in the database url" error SeaQL#435
  • Testing joins with MockDatabase SeaQL#447
  • Surface max_lifetime connection option SeaQL#475

Full Changelog: https://github.com/SeaQL/sea-orm/compare/0.5.0...0.6.0

0.5.0 - 2022-01-01

Fixed Issues

  • Why insert, update, etc return an ActiveModel instead of Model? SeaQL#289
  • Rework ActiveValue SeaQL#321
  • Some missing ActiveEnum utilities SeaQL#338

Merged PRs

  • First metric and tracing implementation by @nappa85 in SeaQL#373
  • Update sea-orm to depends on SeaQL/sea-query#202 by @billy1624 in SeaQL#370
  • Codegen ActiveEnum & Create Enum From ActiveEnum by @billy1624 in SeaQL#348
  • Axum example: update to Axum v0.4.2 by @ttys3 in SeaQL#383
  • Fix rocket version by @Gabriel-Paulucci in SeaQL#384
  • Insert & Update Return Model by @billy1624 in SeaQL#339
  • Rework ActiveValue by @billy1624 in SeaQL#340
  • Add wrapper method ModelTrait::delete by @billy1624 in SeaQL#396
  • Add docker create script for contributors to setup databases locally by @billy1624 in SeaQL#378
  • Log with tracing-subscriber by @billy1624 in SeaQL#399
  • Codegen SQLite by @billy1624 in SeaQL#386
  • PR without clippy warnings in file changed tab by @billy1624 in SeaQL#401
  • Rename sea-strum lib back to strum by @billy1624 in SeaQL#361

Breaking Changes

  • ActiveModel::insert and ActiveModel::update return Model instead of ActiveModel
  • Method ActiveModelBehavior::after_save takes Model as input instead of ActiveModel
  • Rename method sea_orm::unchanged_active_value_not_intended_for_public_use to sea_orm::Unchanged
  • Rename method ActiveValue::unset to ActiveValue::not_set
  • Rename method ActiveValue::is_unset to ActiveValue::is_not_set
  • PartialEq of ActiveValue will also check the equality of state instead of just checking the equality of value

Full Changelog: https://github.com/SeaQL/sea-orm/compare/0.4.2...0.5.0

0.4.2 - 2021-12-12

Fixed Issues

  • Delete::many() doesn't work when schema_name is defined SeaQL#362
  • find_with_related panic SeaQL#374
  • How to define the rust type of TIMESTAMP? SeaQL#344
  • Add Table on the generated Column enum SeaQL#356

Merged PRs

  • Delete::many() with TableRef by @billy1624 in SeaQL#363
  • Fix related & linked with enum columns by @billy1624 in SeaQL#376
  • Temporary Fix: Handling MySQL & SQLite timestamp columns by @billy1624 in SeaQL#379
  • Add feature to generate table Iden by @Sytten in SeaQL#360

0.4.1 - 2021-12-05

Fixed Issues

  • Is it possible to have 4 values Composite Key? SeaQL#352
  • [sea-orm-cli] Better handling of relation generations SeaQL#239

Merged PRs

  • Add TryFromU64 trait for DateTime<FixedOffset>. by @kev0960 in SeaQL#331
  • add offset and limit by @lz1998 in SeaQL#351
  • For some reason the axum_example fail to compile by @billy1624 in SeaQL#355
  • Support Up to 6 Values Composite Primary Key by @billy1624 in SeaQL#353
  • Codegen Handle Self Referencing & Multiple Relations to the Same Related Entity by @billy1624 in SeaQL#347

0.4.0 - 2021-11-19

Fixed Issues

  • Disable SQLx query logging SeaQL#290
  • Code generated by sea-orm-cli cannot pass clippy SeaQL#296
  • Should return detailed error message for connection failure SeaQL#310
  • DateTimeWithTimeZone does not implement Serialize and Deserialize SeaQL#319
  • Support returning clause to avoid database hits SeaQL#183

Merged PRs

  • chore: update to Rust 2021 Edition by @sno2 in SeaQL#273
  • Enumeration - 3 by @billy1624 in SeaQL#274
  • Enumeration - 2 by @billy1624 in SeaQL#261
  • Codegen fix clippy warnings by @billy1624 in SeaQL#303
  • Add axum example by @YoshieraHuang in SeaQL#297
  • Enumeration by @billy1624 in SeaQL#258
  • Add PaginatorTrait and CountTrait for more constraints by @YoshieraHuang in SeaQL#306
  • Continue PaginatorTrait by @billy1624 in SeaQL#307
  • Refactor Schema by @billy1624 in SeaQL#309
  • Detailed connection errors by @billy1624 in SeaQL#312
  • Suppress ouroboros missing docs warnings by @billy1624 in SeaQL#288
  • with-json feature requires chrono/serde by @billy1624 in SeaQL#320
  • Pass the argument entity.table_ref() instead of just entity. by @josh-codes in SeaQL#318
  • Unknown types could be a newtypes instead of ActiveEnum by @billy1624 in SeaQL#324
  • Returning by @billy1624 in SeaQL#292

Breaking Changes

  • Refactor paginate() & count() utilities into PaginatorTrait. You can use the paginator as usual but you might need to import PaginatorTrait manually when upgrading from the previous version.
    use futures::TryStreamExt;
    use sea_orm::{entity::*, query::*, tests_cfg::cake};
    
    let mut cake_stream = cake::Entity::find()
        .order_by_asc(cake::Column::Id)
        .paginate(db, 50)
        .into_stream();
    
    while let Some(cakes) = cake_stream.try_next().await? {
        // Do something on cakes: Vec<cake::Model>
    }
  • The helper struct Schema converting EntityTrait into different sea-query statements now has to be initialized with DbBackend.
    use sea_orm::{tests_cfg::*, DbBackend, Schema};
    use sea_orm::sea_query::TableCreateStatement;
    
    // 0.3.x
    let _: TableCreateStatement = Schema::create_table_from_entity(cake::Entity);
    
    // 0.4.x
    let schema: Schema = Schema::new(DbBackend::MySql);
    let _: TableCreateStatement = schema.create_table_from_entity(cake::Entity);
  • When performing insert or update operation on ActiveModel against PostgreSQL, RETURNING clause will be used to perform select in a single SQL statement.
    // For PostgreSQL
    cake::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 & SQLite
    cake::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()]
            )]);

Full Changelog: https://github.com/SeaQL/sea-orm/compare/0.3.2...0.4.0

0.3.2 - 2021-11-03

Fixed Issues

  • Support for BYTEA Postgres primary keys SeaQL#286

Merged PRs

  • Documentation for sea-orm by @charleschege in SeaQL#280
  • Support Vec<u8> primary key by @billy1624 in SeaQL#287

0.3.1 - 2021-10-23

(We are changing our Changelog format from now on)

Fixed Issues

  • Align case transforms across derive macros SeaQL#262
  • Added is_null and is_not_null to ColumnTrait SeaQL#267

(The following is generated by GitHub)

Merged PRs

  • Changed manual url parsing to use Url crate by @AngelOnFira in SeaQL#253
  • Test self referencing relation by @billy1624 in SeaQL#256
  • Unify case-transform using the same crate by @billy1624 in SeaQL#264
  • CI cleaning by @AngelOnFira in SeaQL#263
  • CI install sea-orm-cli in debug mode by @billy1624 in SeaQL#265

0.3.0 - 2021-10-15

https://www.sea-ql.org/SeaORM/blog/2021-10-15-whats-new-in-0.3.0

  • Built-in Rocket support
  • ConnectOptions
let mut opt = ConnectOptions::new("protocol://username:password@host/database".to_owned());
opt.max_connections(100)
    .min_connections(5)
    .connect_timeout(Duration::from_secs(8))
    .idle_timeout(Duration::from_secs(8));
let db = Database::connect(opt).await?;
  • [#211] Throw error if none of the db rows are affected
assert_eq!(
    Update::one(cake::ActiveModel {
        name: Set("Cheese Cake".to_owned()),
        ..model.into_active_model()
    })
    .exec(&db)
    .await,
    Err(DbErr::RecordNotFound(
        "None of the database rows are affected".to_owned()
    ))
);

// update many remains the same
assert_eq!(
    Update::many(cake::Entity)
        .col_expr(cake::Column::Name, Expr::value("Cheese Cake".to_owned()))
        .filter(cake::Column::Id.eq(2))
        .exec(&db)
        .await,
    Ok(UpdateResult { rows_affected: 0 })
);
  • [#223] ActiveValue::take() & ActiveValue::into_value() without unwrap()
  • [#205] Drop Default trait bound of PrimaryKeyTrait::ValueType
  • [#222] Transaction & streaming
  • [#210] Update ActiveModelBehavior API
  • [#240] Add derive DeriveIntoActiveModel and IntoActiveValue trait
  • [#237] Introduce optional serde support for model code generation
  • [#246] Add #[automatically_derived] to all derived implementations

Full Changelog: https://github.com/SeaQL/sea-orm/compare/0.2.6...0.3.0

0.2.6 - 2021-10-09

  • [#224] [sea-orm-cli] Date & Time column type mapping
  • Escape rust keywords with r# raw identifier

0.2.5 - 2021-10-06

  • [#227] Resolve "Inserting actual none value of Option results in panic"
  • [#219] [sea-orm-cli] Add --tables option
  • [#189] Add debug_query and debug_query_stmt macro

0.2.4 - 2021-10-01

https://www.sea-ql.org/SeaORM/blog/2021-10-01-whats-new-in-0.2.4

  • [#186] [sea-orm-cli] Foreign key handling
  • [#191] [sea-orm-cli] Unique key handling
  • [#182] find_linked join with alias
  • [#202] Accept both postgres:// and postgresql://
  • [#208] Support fetching T, (T, U), (T, U, P) etc
  • [#209] Rename column name & column enum variant
  • [#207] Support chrono::NaiveDate & chrono::NaiveTime
  • Support Condition::not (from sea-query)

0.2.3 - 2021-09-22

  • [#152] DatabaseConnection impl Clone
  • [#175] Impl TryGetableMany for different types of generics
  • Codegen TimestampWithTimeZone fixup

0.2.2 - 2021-09-18

  • [#105] Compact entity format
  • [#132] Add ActiveModel insert & update
  • [#129] Add set method to UpdateMany
  • [#118] Initial lock support
  • [#167] Add FromQueryResult::find_by_statement

0.2.1 - 2021-09-04

  • Update dependencies

0.2.0 - 2021-09-03

  • [#37] Rocket example
  • [#114] log crate and env-logger
  • [#103] InsertResult to return the primary key's type
  • [#89] Represent several relations between same types by Linked
  • [#59] Transforming an Entity into TableCreateStatement

Full Changelog: https://github.com/SeaQL/sea-orm/compare/0.1.3...0.2.0

0.1.3 - 2021-08-30

  • [#108] Remove impl TryGetable for Option

0.1.2 - 2021-08-23

  • [#68] Added DateTimeWithTimeZone as supported attribute type
  • [#70] Generate arbitrary named entity
  • [#80] Custom column name
  • [#81] Support join on multiple columns
  • [#99] Implement FromStr for ColumnTrait

0.1.1 - 2021-08-08

  • Early release of SeaORM