129 KiB
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.
2.0.0 - 2026-07-19
Release Candidates
- 2.0.0-rc.43 —
BelongsTorelation type (opt-in, compile-time FK cardinality), CLI generation-option errors,has_relatedCondition::any()& PG enum-array codegen fixes - 2.0.0-rc.42 — typed value arrays,
HasOnereplace/delete,ActiveHasOne/ActiveHasManyrename, codegenColumnTypefixes - 2.0.0-rc.41 —
SelectFourMany,update_without_returning,cargo binstall sea-orm-cli, junctionActiveModelBehavior& schema-sync PG-schema fixes - 2.0.0-rc.40 - Restore pgvector binding with SQLx 0.9
- 2.0.0-rc.39 - SeaQuery 1.0, SQLx 0.9, async transaction helpers
- 2.0.0-rc.38 —
find_both_related,set_ne, pool options, schema sync fixes - 2.0.0-rc.37 — ER Diagram Generation
- 2.0.0-rc.36 — Per-migration transaction control
- 2.0.0-rc.35 — SQLite transaction modes, DeriveIntoActiveModel extensions, Decimal64/Bytes, schema sync fix
- 2.0.0-rc.34 — Arrow/Parquet support,
try_from_u64for DeriveValueType - 2.0.0-rc.32 —
MigratorTraitwithself, PostgreSQLapplication_name - 2.0.0-rc.31 —
ne_all, typedTextUuid, COUNT overflow fix - 2.0.0-rc.30 — Maintenance release,
sea-querybump - 2.0.0-rc.29 — Tracing spans, UUID-as-TEXT, relation filtering, LEFT JOIN fix
- 2.0.0-rc.28 —
sqlx-allin migration,set_if_not_equals_and, auto_increment for String/Uuid PKs - 2.0.0-rc.27 —
DeriveValueTypeimplementsNotU8for PostgreSQL arrays - 2.0.0-rc.26 —
postgres-use-serial-pkfeature for legacy serial PKs - 2.0.0-rc.25 — Value system restoration,
sea-querybump - 2.0.0-rc.24 —
sea-querybump to rc.27 - 2.0.0-rc.23 —
DeriveValueTypeimplementsIntoActiveValue, removeNotU8 - 2.0.0-rc.22 —
DatabaseExecutorunified type, value array refactor - 2.0.0-rc.21 — Rusqlite /
sea-orm-synccrate,existson PaginatorTrait - 2.0.0-rc.20 — Stringy newtypes, M2M self-ref, nullable columns, bug fixes
New Features
-
Split
belongs_tofromhas_onewith a newBelongsTorelation type https://github.com/SeaQL/sea-orm/pull/3118A
belongs_torelation can now be typedBelongsTo<Entity>(required) orBelongsTo<Option<Entity>>(optional), encoding the foreign-key cardinality in the type, paired with the write-side companionActiveBelongsTo.BelongsTois the recommended type forbelongs_to; the legacyHasOne<Entity>field type remains supported for backward compatibility. -
Role Based Access Control https://github.com/SeaQL/sea-orm/pull/2683
- a hierarchical RBAC engine that is table scoped
- a user has 1 (and only 1) role
- a role has a set of permissions on a set of resources
- permissions here are CRUD operations and resources are tables
- but the engine is generic so can be used for other things
- roles have hierarchy, and so can inherit permissions
- there is a wildcard
*to grant all permissions or resources - individual users can have rules override
- a set of Entities to load / store the access control rules to / from database
- a query auditor that dissect queries for necessary permissions (implemented in SeaQuery)
- integration of RBAC into SeaORM in form of
RestrictedConnection. it implementsConnectionTrait, and will audit all queries and perform permission check, and reject them accordingly. all Entity operations except raw SQL are supported. complex joins, insert select from, and even CTE queries are supported.
- a hierarchical RBAC engine that is table scoped
// load rules from database
db_conn.load_rbac().await?;
// admin can create bakery
let db = db_conn.restricted_for(admin)?;
let seaside_bakery = bakery::ActiveModel {
name: Set("SeaSide Bakery".to_owned()),
..Default::default()
};
assert!(Bakery::insert(seaside_bakery).exec(&db).await.is_ok());
// public cannot create bakery
let db = db_conn.restricted_for(public)?;
assert!(matches!(
Bakery::insert(bakery::ActiveModel::default())
.exec(&db)
.await,
Err(DbErr::AccessDenied { .. })
));
- Overhauled
Entity::insert_many. We've made a number of changes https://github.com/SeaQL/sea-orm/pull/2628- removed APIs that can panic
- new helper struct
InsertMany,last_insert_idis nowOption<Value> - on empty iterator,
Noneorvec![]is returned on exec operations TryInsertAPI is unchanged
Previously, insert_many shares the same helper struct with insert_one, which led to an awkard API.
let res = Bakery::insert_many(std::iter::empty())
.on_empty_do_nothing() // <- you need to add this
.exec(db)
.await;
assert!(matches!(res, Ok(TryInsertResult::Empty)));
last_insert_id is now Option<Value>:
struct InsertManyResult<A: ActiveModelTrait>
{
pub last_insert_id: Option<<PrimaryKey<A> as PrimaryKeyTrait>::ValueType>,
}
Which means the awkardness is removed:
let res = Entity::insert_many::<ActiveModel, _>([]).exec(db).await;
assert_eq!(res?.last_insert_id, None); // insert nothing return None
let res = Entity::insert_many([ActiveModel { id: Set(1) }, ActiveModel { id: Set(2) }])
.exec(db)
.await;
assert_eq!(res?.last_insert_id, Some(2)); // insert something return Some
Same on conflict API as before:
let res = Entity::insert_many([ActiveModel { id: Set(3) }, ActiveModel { id: Set(4) }])
.on_conflict_do_nothing()
.exec(db)
.await;
assert!(matches!(conflict_insert, Ok(TryInsertResult::Conflicted)));
Exec with returning now returns a Vec<Model>, so it feels intuitive:
assert!(
Entity::insert_many::<ActiveModel, _>([])
.exec_with_returning(db)
.await?
.is_empty() // no footgun, nice
);
assert_eq!(
Entity::insert_many([
ActiveModel {
id: NotSet,
value: Set("two".into()),
}
])
.exec_with_returning(db)
.await
.unwrap(),
[
Model {
id: 2,
value: "two".into(),
}
]
);
- Improved utility of
ActiveModel::from_json. Consider the following Entity https://github.com/SeaQL/sea-orm/pull/2599
#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel, Serialize, Deserialize)]
#[sea_orm(table_name = "cake")]
pub struct Model {
#[sea_orm(primary_key)]
pub id: i32, // <- not nullable
pub name: String,
}
Previously, the following would result in error "missing field id":
assert!(
cake::ActiveModel::from_json(json!({
"name": "Apple Pie",
})).is_err();
);
Now, the ActiveModel will be partially filled:
assert_eq!(
cake::ActiveModel::from_json(json!({
"name": "Apple Pie",
}))
.unwrap(),
cake::ActiveModel {
id: NotSet,
name: Set("Apple Pie".to_owned()),
}
);
- A full
Modelcan now be used asPartialModelin nested query https://github.com/SeaQL/sea-orm/pull/2642
#[derive(DerivePartialModel)]
#[sea_orm(entity = "cake::Entity")]
struct Cake {
id: i32,
name: String,
#[sea_orm(nested)]
bakery: Option<bakery::Model>,
}
let cake: Cake = cake::Entity::find()
.left_join(bakery::Entity)
.order_by_asc(cake::Column::Id)
.into_partial_model()
.one(&ctx.db)
.await?
.unwrap();
assert_eq!(cake.id, 13);
assert_eq!(cake.name, "Cheesecake");
assert_eq!(
cake.bakery.unwrap(),
bakery::Model {
id: 42,
name: "cool little bakery".to_string(),
}
);
- Wrapper type derived with
DeriveValueTypecan now be used as primary key https://github.com/SeaQL/sea-orm/pull/2643
#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
#[sea_orm(table_name = "my_value_type")]
pub struct Model {
#[sea_orm(primary_key)]
pub id: MyInteger,
}
#[derive(Clone, Debug, PartialEq, Eq, DeriveValueType)]
pub struct MyInteger(pub i32);
// only for i8 | i16 | i32 | i64 | u8 | u16 | u32 | u64
- You can now define unique keys that span multiple columns in Entity https://github.com/SeaQL/sea-orm/pull/2651
#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
#[sea_orm(table_name = "lineitem")]
pub struct Model {
#[sea_orm(primary_key)]
pub id: i32,
#[sea_orm(unique_key = "item")]
pub order_id: i32,
#[sea_orm(unique_key = "item")]
pub cake_id: i32,
}
let stmts = Schema::new(backend).create_index_from_entity(lineitem::Entity);
assert_eq!(
stmts[0],
Index::create()
.name("idx-lineitem-item")
.table(lineitem::Entity)
.col(lineitem::Column::OrderId)
.col(lineitem::Column::CakeId)
.unique()
.take()
);
assert_eq!(
backend.build(stmts[0]),
r#"CREATE UNIQUE INDEX "idx-lineitem-item" ON "lineitem" ("order_id", "cake_id")"#
);
- Overhauled
ConnectionTraitAPI:execute,query_one,query_all,streamnow takes in SeaQuery statement instead of raw SQL statement https://github.com/SeaQL/sea-orm/pull/2657
// old
let query: SelectStatement = Entity::find().filter(..).into_query();
let backend = self.db.get_database_backend();
let stmt = backend.build(&query);
let rows = self.db.query_all(stmt).await?;
// new
let query: SelectStatement = Entity::find().filter(..).into_query();
let rows = self.db.query_all(&query).await?;
- Added
raw_sqlmacro for ergonomic parameter injection
#[derive(FromQueryResult)]
struct Cake {
name: String,
#[sea_orm(nested)]
bakery: Option<Bakery>,
}
#[derive(FromQueryResult)]
struct Bakery {
#[sea_orm(alias = "bakery_name")]
name: String,
}
let cake_ids = [2, 3, 4]; // expanded by the `..` operator
let cake: Option<Cake> = Cake::find_by_statement(raw_sql!(
Sqlite,
r#"SELECT "cake"."name", "bakery"."name" AS "bakery_name"
FROM "cake"
LEFT JOIN "bakery" ON "cake"."bakery_id" = "bakery"."id"
WHERE "cake"."id" IN ({..cake_ids})"#
))
.one(db)
.await?;
- Added
consolidatemethod toSelectThree. This output has different shape depending on the topology of the join.
// Order -> Customer
// -> Lineitem
let items: Vec<(order::Model, Option<customer::Model>, Option<lineitem::Model>)> =
order::Entity::find()
.find_also_related(customer::Entity)
.find_also_related(lineitem::Entity)
.order_by_asc(order::Column::Id)
.order_by_asc(lineitem::Column::Id)
.all(&ctx.db)
.await?;
// flat result
assert_eq!(
items,
vec![
(order, Some(customer), Some(line_1)),
(order, Some(customer), Some(line_2)),
]
);
let items: Vec<(order::Model, Vec<customer::Model>, Vec<lineitem::Model>)> =
order::Entity::find()
.find_also_related(customer::Entity)
.find_also_related(lineitem::Entity)
.order_by_asc(order::Column::Id)
.order_by_asc(lineitem::Column::Id)
.consolidate() // <-
.all(&ctx.db)
.await?;
// consolidated by order
assert_eq!(
items,
vec![(
order,
vec![customer],
vec![line_1, line_2]
)]
);
// Order -> Lineitem -> Cake
let items: Vec<(order::Model, Option<lineitem::Model>, Option<cake::Model>)> =
order::Entity::find()
.find_also_related(lineitem::Entity)
.and_also_related(cake::Entity)
.order_by_asc(order::Column::Id)
.order_by_asc(lineitem::Column::Id)
.all(&ctx.db)
.await?;
// flat result
assert_eq!(
items,
vec![
(order, Some(line_1), Some(cake_1)),
(order, Some(line_2), Some(cake_2)),
]
);
let items: Vec<(order::Model, Vec<(lineitem::Model, Vec<cake::Model>)>)> =
order::Entity::find()
.find_also_related(lineitem::Entity)
.and_also_related(cake::Entity)
.order_by_asc(order::Column::Id)
.order_by_asc(lineitem::Column::Id)
.consolidate() // <-
.all(&ctx.db)
.await?;
// consolidated by order first, then by line
assert_eq!(
items,
vec![(
order,
vec![(line_1, vec![cake_1]), (line_2, vec![cake_2])]
)]
);
- Added
Select::has_related
// cake -> fruit: find all cakes containing mango
assert_eq!(
cake::Entity::find()
.has_related(fruit::Entity, fruit::Column::Name.eq("Mango"))
.build(DbBackend::Sqlite)
.to_string(),
[
r#"SELECT "cake"."id", "cake"."name" FROM "cake""#,
r#"WHERE EXISTS(SELECT 1 FROM "fruit""#,
r#"WHERE "fruit"."name" = 'Mango'"#,
r#"AND "cake"."id" = "fruit"."cake_id")"#,
]
.join(" ")
);
// cake -> cake_filling -> filling: find all cakes with orange fillings
assert_eq!(
cake::Entity::find()
.has_related(filling::Entity, filling::Column::Name.eq("Marmalade"))
.build(DbBackend::Sqlite)
.to_string(),
[
r#"SELECT "cake"."id", "cake"."name" FROM "cake""#,
r#"WHERE EXISTS(SELECT 1 FROM "filling""#,
r#"INNER JOIN "cake_filling" ON "cake_filling"."filling_id" = "filling"."id""#,
r#"WHERE "filling"."name" = 'Marmalade'"#,
r#"AND "cake"."id" = "cake_filling"."cake_id")"#,
]
.join(" ")
);
- Support self-referencing relations in loader
#[sea_orm::model]
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)]
#[sea_orm(table_name = "staff")]
pub struct Model {
#[sea_orm(primary_key)]
pub id: i32,
pub name: String,
pub reports_to_id: Option<i32>,
#[sea_orm(self_ref, relation_enum = "ReportsTo", from = "reports_to_id", to = "id")]
pub reports_to: HasOne<Entity>,
}
// Entity Loader
let staff = staff::Entity::load()
.with(staff::Relation::ReportsTo)
.all(db)
.await?;
assert_eq!(staff[0].name, "Alan");
assert_eq!(staff[0].reports_to, None);
assert_eq!(staff[1].name, "Ben");
assert_eq!(staff[1].reports_to.as_ref().unwrap().name, "Alan");
assert_eq!(staff[2].name, "Alice");
assert_eq!(staff[2].reports_to.as_ref().unwrap().name, "Alan");
// Model Loader
let staff = staff::Entity::find().all(db).await?;
let reports_to = staff
.load_self(staff::Entity, staff::Relation::ReportsTo, db)
.await?;
assert_eq!(staff[0].name, "Alan");
assert_eq!(reports_to[0], None);
assert_eq!(staff[1].name, "Ben");
assert_eq!(reports_to[1].unwrap().name, "Alan");
assert_eq!(staff[2].name, "Alice");
assert_eq!(reports_to[2].unwrap().name, "Alan");
- Strongly-typed column https://github.com/SeaQL/sea-orm/pull/2794
// old
user::Entity::find().filter(user::Column::Name.contains("Bob"))
// new
user::Entity::find().filter(user::COLUMN.name.contains("Bob"))
// compile error: the trait `From<{integer}>` is not implemented for `String`
user::Entity::find().filter(user::COLUMN.name.like(2))
- Unix timestamp column type that will be mapped to big integer in database
#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
#[sea_orm(table_name = "access_log")]
pub struct Model {
.. // with `chrono` crate
pub ts: ChronoUnixTimestamp,
pub ms: ChronoUnixTimestampMillis,
.. // with `time` crate
pub ts: TimeUnixTimestamp,
pub ms: TimeUnixTimestampMillis,
}
-
Nested ActiveModel (ActiveModelEx) and cascade operations https://github.com/SeaQL/sea-orm/pull/2818
The following operation saves a new set of user + profile + post + tag + post_tag into the database atomically:
let user = user::ActiveModel::builder()
.set_name("Bob")
.set_email("bob@sea-ql.org")
.set_profile(profile::ActiveModel::builder().set_picture("image.jpg"))
.add_post(
post::ActiveModel::builder()
.set_title("Nice weather")
.add_tag(tag::ActiveModel::builder().set_tag("sunny")),
)
.save(db)
.await?;
Enhancements
- Added
serdefeature TextUuidnow derivesSerializeandDeserializewhen theserdefeature is enabled- [sea-orm-cli] Added
--column-extra-deriveshttps://github.com/SeaQL/sea-orm/pull/2212 - [sea-orm-cli] Added
--big-integer-type=i32to use i32 for bigint (for SQLite) - [sea-orm-cli] Fix codegen to not generate relations to filtered entities https://github.com/SeaQL/sea-orm/pull/2913
- [sea-orm-cli] Added
--experimental-preserve-user-modificationshttps://github.com/SeaQL/sea-orm/pull/2755 https://github.com/SeaQL/sea-orm/pull/2964 - [sea-orm-migration] Add custom connection entrypoint to migration CLI https://github.com/SeaQL/sea-orm/pull/3035
- Added
Model::try_set - Added new error variant
BackendNotSupported. Previously, it panics with e.g. "Database backend doesn't support RETURNING" https://github.com/SeaQL/sea-orm/pull/2630
let result = cake::Entity::insert_many([])
.exec_with_returning_keys(db)
.await;
if db.support_returning() {
// Postgres and SQLite
assert_eq!(result.unwrap(), []);
} else {
// MySQL
assert!(matches!(result, Err(DbErr::BackendNotSupported { .. })));
}
- Added new error variant
PrimaryKeyNotSet. Previously, it panics with "PrimaryKey is not set" https://github.com/SeaQL/sea-orm/pull/2627
assert!(matches!(
Update::one(cake::ActiveModel {
..Default::default()
})
.exec(&db)
.await,
Err(DbErr::PrimaryKeyNotSet { .. })
));
- Remove panics in
Schema::create_enum_from_active_enumhttps://github.com/SeaQL/sea-orm/pull/2634
fn create_enum_from_active_enum<A>(&self) -> Option<TypeCreateStatement>
// method can now return None
- Added
ColumnTrait::eq_anyas a shorthand for the= ANYoperator. Postgres only.
assert_eq!(
cake::Entity::find()
.filter(cake::Column::Id.eq_any(vec![4, 5]))
.build(DbBackend::Postgres)
.to_string(),
r#"SELECT "cake"."id", "cake"."name" FROM "cake" WHERE "cake"."id" = ANY(ARRAY [4,5])"#
);
- Added
ActiveModelTrait::try_set
pub trait ActiveModelTrait {
/// old: set the Value of a ActiveModel field, panic if failed
fn set(&mut self, c: <Self::Entity as EntityTrait>::Column, v: Value) {
self.try_set(c, v).unwrap_or_else(|e| panic!(..))
}
/// new: same as above but non-panicking
fn try_set(&mut self, c: <Self::Entity as EntityTrait>::Column, v: Value) -> Result<(), DbErr>;
}
Linkedcan now be used in partial select, in caseRelatedcannot be defined
pub struct ToBakery;
impl Linked for ToBakery {
type FromEntity = super::cake::Entity;
type ToEntity = super::bakery::Entity;
fn link(&self) -> Vec<RelationDef> {
vec![Relation::Bakery.def()]
}
}
#[derive(Debug, DerivePartialModel)]
#[sea_orm(entity = "cake::Entity", into_active_model)]
struct Cake2 {
id: i32,
name: String,
#[sea_orm(nested, alias = "r0")]
bakery: Option<Bakery>,
#[sea_orm(skip)]
ignore: Ignore,
}
let cake2: Cake2 = cake::Entity::find()
.left_join_linked(ToBakery)
.order_by_asc(cake::Column::Id)
.into_partial_model()
.one(&ctx.db)
.await?
.unwrap();
RelationDefnow implementsClone.on_conditionis changed toArcbut this is a minor breaking change.- Added
extraon column attribute:
#[cfg(feature = "with-rust_decimal")]
#[sea_orm(extra = "CHECK (price > 0)")]
pub price: Decimal,
// results in:
ColumnDef::new("price")
.decimal()
.not_null()
.extra("CHECK (price > 0)"),
- Added
ColumnTrait::avg, in addition tosum,min,maxetc
let average: Decimal = order::Entity::find()
.select_only()
.column_as(order::Column::Total.avg(), "avg")
.into_tuple()
.one(&ctx.db)
.await?
.unwrap();
SchemaBuilder::synccan now be used in migrations
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
let db = manager.get_connection();
db.get_schema_builder()
.register(note::Entity)
.sync(db)
.await
}
}
- Allowed None for
max_lifetimeandidle_timeoutParameters https://github.com/SeaQL/sea-orm/pull/2748 - Try to parse
u32in Postgres asi32https://github.com/SeaQL/sea-orm/pull/2753 DeriveActiveEnumnow also implIntoActiveValuehttps://github.com/SeaQL/sea-orm/issues/1972DeriveValueTypenow also supports any structs that can be converted to / from string https://github.com/SeaQL/sea-orm/issues/2811
#[derive(Copy, Clone, Debug, PartialEq, Eq, DeriveValueType)]
#[sea_orm(value_type = "String")]
pub struct Tag3 {
pub i: i64,
}
impl std::fmt::Display for Tag3 {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.i)
}
}
impl std::str::FromStr for Tag3 {
type Err = std::num::ParseIntError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let i: i64 = s.parse()?;
Ok(Self { i })
}
}
- Fix
DeriveIntoActiveModelonOption<T>fields https://github.com/SeaQL/sea-orm/pull/2926
#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
#[sea_orm(table_name = "fruit")]
pub struct Model {
#[sea_orm(primary_key)]
pub id: i32,
pub name: String,
pub cake_id: Option<i32>,
}
#[derive(DeriveIntoActiveModel)]
#[sea_orm(active_model = "<fruit::Entity as EntityTrait>::ActiveModel")]
struct PartialFruit {
cake_id: Option<i32>,
}
assert_eq!(
PartialFruit { cake_id: Some(1) }.into_active_model(),
fruit::ActiveModel { id: NotSet, name: NotSet, cake_id: Set(Some(1)) }
);
assert_eq!(
PartialFruit { cake_id: None }.into_active_model(),
fruit::ActiveModel { id: NotSet, name: NotSet, cake_id: NotSet }
);
FromQueryResultnow supports nullable nested model https://github.com/SeaQL/sea-orm/pull/2845
#[derive(FromQueryResult)]
struct CakeWithOptionalBakeryModel {
#[sea_orm(alias = "cake_id")]
id: i32,
#[sea_orm(alias = "cake_name")]
name: String,
#[sea_orm(nested)]
bakery: Option<bakery::Model>, // can be null
}
- Added
try_from_u64toDeriveValueTypehttps://github.com/SeaQL/sea-orm/pull/2958
// Test for try_from_u64 attribute with type alias
type UserId = i32;
#[derive(Clone, Debug, PartialEq, Eq, DeriveValueType)]
#[sea_orm(try_from_u64)]
pub struct MyUserId(pub UserId);
- Arrow / Parquet support https://github.com/SeaQL/sea-orm/pull/2957
- Added
ArrowSchema,DeriveArrowSchema - Support decimal with different formats
- Support timestamp with different timezone / resolution
- Added parquet example
- Added
- Support
HashMapandBTreeMapfor JSON columns viaTryGetableFromJsonhttps://github.com/SeaQL/sea-orm/pull/3009 - Derive macros now inherit the visibility of the input type for generated items such as
Entity,Column,PrimaryKey, andActiveModelhttps://github.com/SeaQL/sea-orm/pull/3029
Bug Fixes
- [sea-orm-migration] PostgreSQL
drop_everythingnow drops custom types withCASCADE
Breaking Changes
Please read SeaQuery's breaking changes as well. But for most compile errors, you can simply add use sea_orm::ExprTrait; in scope.
error[E0599]: no method named `like` found for enum `sea_query::Expr` in the current scope
|
| Expr::col((self.entity_name(), *self)).like(s)
|
| fn like<L>(self, like: L) -> Expr
| ---- the method is available for `sea_query::Expr` here
|
= help: items from traits can only be used if the trait is in scope
help: trait `ExprTrait` which provides `like` is implemented but not in scope; perhaps you want to import it
|
-> + use sea_orm::ExprTrait;
error[E0308]: mismatched types
--> src/sqlite/discovery.rs:27:57
|
| .and_where(Expr::col(Alias::new("type")).eq("table"))
| -- ^^^^^^^ expected `&Expr`, found `&str`
| |
| arguments to this method are incorrect
|
= note: expected reference `&sea_query::Expr`
found reference `&'static str`
error[E0308]: mismatched types
|
390 | Some(Expr::col(Name).eq(PgFunc::any(query.symbol)))
| -- ^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `&Expr`, found `FunctionCall`
| |
| arguments to this method are incorrect
|
note: method defined here
--> /rustc/6b00bc3880198600130e1cf62b8f8a93494488cc/library/core/src/cmp.rs:254:8
error[E0277]: the trait bound `sea_orm::Condition: From<bool>` is not satisfied
|
367 | .add_option(option)
| ---------- ^^^^^^ the trait `From<bool>` is not implemented for `sea_orm::Condition`
| |
| required by a bound introduced by this call
|
= note: required for `bool` to implement `Into<sea_orm::Condition>`
- Removed
runtime-actixfeature flag. It's been an alias ofruntime-tokiofor more than a year, so there should be no impact. - Enabled
sqlite-use-returning-for-3_35by default. SQLite3.35was released in 2021, it should be the default by now. - Now implemented
impl<T: ModelTrait + FromQueryResult> PartialModelTrait for T, there may be a potential conflict https://github.com/SeaQL/sea-orm/pull/2642 - Now
DeriveValueTypewill alsoTryFromU64if applicable, there may be a potential conflict https://github.com/SeaQL/sea-orm/pull/2643 - Now
DeriveValueTypealso implIntoActiveValueandNotU8, there may be a potential conflict - Added
TryIntoModelandSerializeto trait bounds ofActiveModel::from_json. There should be no impact if your models are derived withDeriveEntityModelhttps://github.com/SeaQL/sea-orm/pull/2599
fn from_json(mut json: serde_json::Value) -> Result<Self, DbErr>
where
Self: TryIntoModel<<Self::Entity as EntityTrait>::Model>,
<<Self as ActiveModelTrait>::Entity as EntityTrait>::Model: IntoActiveModel<Self>,
for<'de> <<Self as ActiveModelTrait>::Entity as EntityTrait>::Model:
serde::de::Deserialize<'de> + serde::Serialize,
DerivePartialModelnow implementFromQueryResultby default, so there may be a potential conflict. RemoveFromQueryResultin these cases https://github.com/SeaQL/sea-orm/pull/2653
error[E0119]: conflicting implementations of trait `sea_orm::FromQueryResult` for type `CakeWithFruit`
|
> | #[derive(DerivePartialModel, FromQueryResult)]
| ------------------ ^^^^^^^^^^^^^^^ conflicting implementation for `CakeWithFruit`
- Changed
IdenStaticandEntityNamedefinition https://github.com/SeaQL/sea-orm/pull/2667
trait IdenStatic {
fn as_str(&self) -> &'static str; // added static lifetime
}
trait EntityName {
fn table_name(&self) -> &'static str; // added static lifetime
}
- Removed
DeriveCustomColumnanddefault_as_strhttps://github.com/SeaQL/sea-orm/pull/2667
// This is no longer supported:
#[derive(Copy, Clone, Debug, EnumIter, DeriveCustomColumn)]
pub enum Column {
Id,
Name,
}
impl IdenStatic for Column {
fn as_str(&self) -> &str {
match self {
Self::Name => "my_name",
_ => self.default_as_str(),
}
}
}
// Do the following instead:
#[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)]
pub enum Column {
Id,
#[sea_orm(column_name = "my_name")]
Name,
}
execute,query_one,query_all,streamnow takes in SeaQuery statement instead of raw SQL statement. a new set of methodsexecute_raw,query_one_raw,query_all_raw,stream_rawis added https://github.com/SeaQL/sea-orm/pull/2657
--> src/executor/paginator.rs:53:38
|
> | let rows = self.db.query_all(stmt).await?;
| --------- ^^^^ expected `&_`, found `Statement`
| |
| arguments to this method are incorrect
|
= note: expected reference `&_`
found struct `statement::Statement`
let backend = self.db.get_database_backend();
let stmt = backend.build(&query);
// change to:
let rows = self.db.query_all_raw(stmt).await?;
// if the query is a SeaQuery statement, then just do this:
let rows = self.db.query_all(&query).await?; // no need to build query
DatabaseConnectionis changed from enum to struct. The original enum is moved intoDatabaseConnection::inner. The new enum is namedDatabaseConnectionTypehttps://github.com/SeaQL/sea-orm/pull/2671
error[E0599]: no associated item named `Disconnected` found for struct `db_connection::DatabaseConnection` in the current scope
--> src/database/db_connection.rs:137:33
|
> | pub struct DatabaseConnection {
| ----------------------------- associated item `Disconnected` not found for this struct
...
> | DatabaseConnection::Disconnected => Err(conn_err("Disconnected")),
| ^^^^^^^^^^^^ associated item not found in `DatabaseConnection`
match conn.inner {
DatabaseConnectionType::Disconnected => (),
_ => (),
}
DeleteOneandUpdateOneno longer implementQueryFilterandQueryTraitdirectly. Those implementations could expose an incomplete SQL query with an incomplete condition that touches too many records. To generate the right condition, we must make sure that the primary key is set on the inputActiveModel. If you need to access the generated SQL query, convert intoValidatedDeleteOne/ValidatedUpdateOnefirst.
error[E0599]: no method named `build` found for struct `query::update::UpdateOne` in the current scope
--> src/entity/column.rs:607:22
|
> | / Update::one(active_model)
> | | .build(DbBackend::Postgres)
| | -^^^^^ method not found in `UpdateOne<A>`
| |_____________________|
|
Call the validate() method:
Update::one(active_model)
+ .validate()?
.build(DbBackend::Postgres)
- Removed
DbBackend::get_query_builder()becauseQueryBuilderis not longer object safe.
- fn get_query_builder(&self) -> Box<dyn QueryBuilder>
- A number of methods has been removed from
SelectTwoMany:into_partial_model,into_json,stream. These methods are same as those inSelectTwo. Please useCake::find().find_also_related(Fruit).into_json()instead. - The
delete_by_idmethod has changed to returningDeleteOneinstead ofDeleteMany. It doesn't change normalexecusage, but would change return type ofexec_with_returningtoOption<Model>
fn delete_by_id<T>(values: T) -> DeleteMany<Self> // old
fn delete_by_id<T>(values: T) -> ValidatedDeleteOne<Self> // new
DeriveActiveEnumnow also automatically implIntoActiveValue, if you have a custom impl before, there would be a collisionwith-bigdecimalis now removed from default featuresRuntimeErr::SqlxErroris now held inArcto makeDbErrclonable and smaller:
pub enum RuntimeErr {
SqlxError(Arc<sqlx::error::Error>),
Upgrades
- Upgraded Rust Edition to 2024 https://github.com/SeaQL/sea-orm/pull/2596
- Upgraded
strumto0.27
1.1.19 - 2025-11-11
Enhancements
- Add
find_linked_recursivemethod to ModelTrait https://github.com/SeaQL/sea-orm/pull/2480 - Skip drop extension type in fresh https://github.com/SeaQL/sea-orm/pull/2716
Bug Fixes
- Handle null values in
from_sqlx_*_row_to_proxy_rowfunctions https://github.com/SeaQL/sea-orm/pull/2744
1.1.17 - 2025-10-09
New Features
- Added
map_sqlx_mysql_opts,map_sqlx_postgres_opts,map_sqlx_sqlite_optstoConnectOptionshttps://github.com/SeaQL/sea-orm/pull/2731
let mut opt = ConnectOptions::new(url);
opt.map_sqlx_postgres_opts(|pg_opt: PgConnectOptions| {
pg_opt.ssl_mode(PgSslMode::Require)
});
- Added
mariadb-use-returningto use returning syntax for MariaDB https://github.com/SeaQL/sea-orm/pull/2710 - Released
sea-orm-rocket0.6 https://github.com/SeaQL/sea-orm/pull/2732
1.1.16 - 2025-09-11
Bug Fixes
- Fix enum casting in DerivePartialModel https://github.com/SeaQL/sea-orm/pull/2719 https://github.com/SeaQL/sea-orm/pull/2720
#[derive(DerivePartialModel)]
#[sea_orm(entity = "active_enum::Entity", from_query_result, alias = "zzz")]
struct PartialWithEnumAndAlias {
#[sea_orm(from_col = "tea")]
foo: Option<Tea>,
}
let sql = active_enum::Entity::find()
.into_partial_model::<PartialWithEnumAndAlias>()
.into_statement(DbBackend::Postgres)
.sql;
assert_eq!(
sql,
r#"SELECT CAST("zzz"."tea" AS "text") AS "foo" FROM "public"."active_enum""#,
);
Enhancements
- [sea-orm-cli] Use tokio (optional) instead of async-std https://github.com/SeaQL/sea-orm/pull/2721
1.1.15 - 2025-08-31
Enhancements
- Allow
DerivePartialModelto have nested aliases https://github.com/SeaQL/sea-orm/pull/2686
#[derive(DerivePartialModel)]
#[sea_orm(entity = "bakery::Entity", from_query_result)]
struct Factory {
id: i32,
#[sea_orm(from_col = "name")]
plant: String,
}
#[derive(DerivePartialModel)]
#[sea_orm(entity = "cake::Entity", from_query_result)]
struct CakeFactory {
id: i32,
name: String,
#[sea_orm(nested, alias = "factory")] // <- new
bakery: Option<Factory>,
}
- Add
ActiveModelTrait::try_sethttps://github.com/SeaQL/sea-orm/pull/2706
fn set(&mut self, c: <Self::Entity as EntityTrait>::Column, v: Value);
/// New: a non-panicking version of above
fn try_set(&mut self, c: <Self::Entity as EntityTrait>::Column, v: Value) -> Result<(), DbErr>;
Bug Fixes
- [sea-orm-cli] Fix compilation issue https://github.com/SeaQL/sea-orm/pull/2713
1.1.14 - 2025-07-21
Enhancements
- [sea-orm-cli] Mask sensitive ENV values https://github.com/SeaQL/sea-orm/pull/2658
Bug Fixes
FromJsonQueryResult: panic on serialization failures https://github.com/SeaQL/sea-orm/pull/2635
#[derive(Clone, Debug, PartialEq, Deserialize, FromJsonQueryResult)]
pub struct NonSerializableStruct;
impl Serialize for NonSerializableStruct {
fn serialize<S>(&self, _serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
Err(serde::ser::Error::custom(
"intentionally failing serialization",
))
}
}
let model = Model {
json: Some(NonSerializableStruct),
};
let _ = model.into_active_model().insert(&ctx.db).await; // panic here
1.1.13 - 2025-06-29
New Features
- [sea-orm-cli] New
--frontend-formatflag to generate entities in pure Rust https://github.com/SeaQL/sea-orm/pull/2631
// for example, below is the normal (compact) Entity:
use sea_orm::entity::prelude::*;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq, Serialize, Deserialize)]
#[sea_orm(table_name = "cake")]
pub struct Model {
#[sea_orm(primary_key)]
#[serde(skip_deserializing)]
pub id: i32,
#[sea_orm(column_type = "Text", nullable)]
pub name: Option<String> ,
}
// this is the generated frontend model, there is no SeaORM dependency:
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct Model {
#[serde(skip_deserializing)]
pub id: i32,
pub name: Option<String> ,
}
Enhancements
- Removed potential panics from
Loaderhttps://github.com/SeaQL/sea-orm/pull/2637
1.1.12 - 2025-05-27
Enhancements
- Make sea-orm-cli & sea-orm-migration dependencies optional https://github.com/SeaQL/sea-orm/pull/2367
- Relax TransactionError's trait bound for errors to allow
anyhow::Errorhttps://github.com/SeaQL/sea-orm/pull/2602
Bug Fixes
- Include custom
column_namein DeriveColumnColumn::from_strimpl https://github.com/SeaQL/sea-orm/pull/2603
#[derive(DeriveEntityModel)]
pub struct Model {
#[sea_orm(column_name = "lAsTnAmE")]
last_name: String,
}
assert!(matches!(Column::from_str("lAsTnAmE").unwrap(), Column::LastName));
1.1.11 - 2025-05-07
Enhancements
- Added
ActiveModelTrait::default_values
assert_eq!(
fruit::ActiveModel::default_values(),
fruit::ActiveModel {
id: Set(0),
name: Set("".into()),
cake_id: Set(None),
type_without_default: NotSet,
},
);
- Impl
IntoConditionforRelationDefhttps://github.com/SeaQL/sea-orm/pull/2587
// This allows using `RelationDef` directly where sea-query expects an `IntoCondition`
let query = Query::select()
.from(fruit::Entity)
.inner_join(cake::Entity, fruit::Relation::Cake.def())
.to_owned();
- Loader: retain only unique key values in the query condition https://github.com/SeaQL/sea-orm/pull/2569
- Add proxy transaction impl https://github.com/SeaQL/sea-orm/pull/2573
- [sea-orm-cli] Fix
PgVectorcodegen https://github.com/SeaQL/sea-orm/pull/2589
Bug fixes
- Quote type properly in
AsEnumcasting https://github.com/SeaQL/sea-orm/pull/2570
assert_eq!(
lunch_set::Entity::find()
.select_only()
.column(lunch_set::Column::Tea)
.build(DbBackend::Postgres)
.to_string(),
r#"SELECT CAST("lunch_set"."tea" AS "text") FROM "lunch_set""#
// "text" is now quoted; will work for "text"[] as well
);
- Fix unicode string enum https://github.com/SeaQL/sea-orm/pull/2218
Upgrades
- Upgrade
heckto0.5https://github.com/SeaQL/sea-orm/pull/2218 - Upgrade
sea-queryto0.32.5 - Upgrade
sea-schemato0.16.2
1.1.10 - 2025-04-14
Upgrades
- Upgrade sqlx to 0.8.4 https://github.com/SeaQL/sea-orm/pull/2562
1.1.9 - 2025-04-14
Enhancements
- [sea-orm-macros] Use fully-qualified syntax for ActiveEnum associated type https://github.com/SeaQL/sea-orm/pull/2552
- Accept
LikeExprinlikeandnot_likehttps://github.com/SeaQL/sea-orm/pull/2549
Bug fixes
- Check if url is well-formed before parsing https://github.com/SeaQL/sea-orm/pull/2558
QuerySelect::column_asmethod cast ActiveEnum column https://github.com/SeaQL/sea-orm/pull/2551
House keeping
- Remove redundant
Expr::exprfrom internal code https://github.com/SeaQL/sea-orm/pull/2554
1.1.8 - 2025-03-30
New Features
- Implement
DeriveValueTypefor enum strings
#[derive(DeriveValueType)]
#[sea_orm(value_type = "String")]
pub enum Tag {
Hard,
Soft,
}
// `from_str` defaults to `std::str::FromStr::from_str`
impl std::str::FromStr for Tag {
type Err = sea_orm::sea_query::ValueTypeErr;
fn from_str(s: &str) -> Result<Self, Self::Err> { .. }
}
// `to_str` defaults to `std::string::ToString::to_string`.
impl std::fmt::Display for Tag {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { .. }
}
// you can override from_str and to_str with custom functions
#[derive(DeriveValueType)]
#[sea_orm(value_type = "String", from_str = "Tag::from_str", to_str = "Tag::to_str")]
pub enum Tag {
Color,
Grey,
}
impl Tag {
fn from_str(s: &str) -> Result<Self, ValueTypeErr> { .. }
fn to_str(&self) -> &'static str { .. }
}
- Support Postgres Ipnetwork (under feature flag
with-ipnetwork) https://github.com/SeaQL/sea-orm/pull/2395
// Model
#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
#[sea_orm(table_name = "host_network")]
pub struct Model {
#[sea_orm(primary_key)]
pub id: i32,
pub ipaddress: IpNetwork,
#[sea_orm(column_type = "Cidr")]
pub network: IpNetwork,
}
// Schema
sea_query::Table::create()
.table(host_network::Entity)
.col(ColumnDef::new(host_network::Column::Id).integer().not_null().auto_increment().primary_key())
.col(ColumnDef::new(host_network::Column::Ipaddress).inet().not_null())
.col(ColumnDef::new(host_network::Column::Network).cidr().not_null())
.to_owned();
// CRUD
host_network::ActiveModel {
ipaddress: Set(IpNetwork::new(Ipv6Addr::new(..))),
network: Set(IpNetwork::new(Ipv4Addr::new(..))),
..Default::default()
}
Enhancements
- Added
try_getable_postgres_array!(Vec<u8>)(to supportbytea[]) https://github.com/SeaQL/sea-orm/pull/2503
Bug fixes
- [sea-orm-codegen] Support postgres array in expanded format https://github.com/SeaQL/sea-orm/pull/2545
House keeping
- Replace
once_cellcrate withstdequivalent https://github.com/SeaQL/sea-orm/pull/2524 (available since rust 1.80)
1.1.7 - 2025-03-02
New Features
- Support nested entities in
FromQueryResulthttps://github.com/SeaQL/sea-orm/pull/2508
#[derive(FromQueryResult)]
struct Cake {
id: i32,
name: String,
#[sea_orm(nested)]
bakery: Option<CakeBakery>,
}
#[derive(FromQueryResult)]
struct CakeBakery {
#[sea_orm(from_alias = "bakery_id")]
id: i32,
#[sea_orm(from_alias = "bakery_name")]
title: String,
}
let cake: Cake = cake::Entity::find()
.select_only()
.column(cake::Column::Id)
.column(cake::Column::Name)
.column_as(bakery::Column::Id, "bakery_id")
.column_as(bakery::Column::Name, "bakery_name")
.left_join(bakery::Entity)
.order_by_asc(cake::Column::Id)
.into_model()
.one(&ctx.db)
.await?
.unwrap();
assert_eq!(
cake,
Cake {
id: 1,
name: "Cake".to_string(),
bakery: Some(CakeBakery {
id: 20,
title: "Bakery".to_string(),
})
}
);
- Support nested entities in
DerivePartialModelhttps://github.com/SeaQL/sea-orm/pull/2508
#[derive(DerivePartialModel)] // FromQueryResult is no longer needed
#[sea_orm(entity = "cake::Entity", from_query_result)]
struct Cake {
id: i32,
name: String,
#[sea_orm(nested)]
bakery: Option<Bakery>,
}
#[derive(DerivePartialModel)]
#[sea_orm(entity = "bakery::Entity", from_query_result)]
struct Bakery {
id: i32,
#[sea_orm(from_col = "Name")]
title: String,
}
// same as previous example, but without the custom selects
let cake: Cake = cake::Entity::find()
.left_join(bakery::Entity)
.order_by_asc(cake::Column::Id)
.into_partial_model()
.one(&ctx.db)
.await?
.unwrap();
assert_eq!(
cake,
Cake {
id: 1,
name: "Cake".to_string(),
bakery: Some(CakeBakery {
id: 20,
title: "Bakery".to_string(),
})
}
);
- Derive also
IntoActiveModelwithDerivePartialModelhttps://github.com/SeaQL/sea-orm/pull/2517
#[derive(DerivePartialModel)]
#[sea_orm(entity = "cake::Entity", into_active_model)]
struct Cake {
id: i32,
name: String,
}
assert_eq!(
Cake {
id: 12,
name: "Lemon Drizzle".to_owned(),
}
.into_active_model(),
cake::ActiveModel {
id: Set(12),
name: Set("Lemon Drizzle".to_owned()),
..Default::default()
}
);
- Added
SelectThreehttps://github.com/SeaQL/sea-orm/pull/2518
// Order -> (many) Lineitem -> Cake
let items: Vec<(order::Model, Option<lineitem::Model>, Option<cake::Model>)> =
order::Entity::find()
.find_also_related(lineitem::Entity)
.and_also_related(cake::Entity)
.order_by_asc(order::Column::Id)
.order_by_asc(lineitem::Column::Id)
.all(&ctx.db)
.await?;
Enhancements
- Support complex type path in
DeriveIntoActiveModelhttps://github.com/SeaQL/sea-orm/pull/2517
#[derive(DeriveIntoActiveModel)]
#[sea_orm(active_model = "<fruit::Entity as EntityTrait>::ActiveModel")]
struct Fruit {
cake_id: Option<Option<i32>>,
}
- Added
DatabaseConnection::close_by_refhttps://github.com/SeaQL/sea-orm/pull/2511
pub async fn close(self) -> Result<(), DbErr> { .. } // existing
pub async fn close_by_ref(&self) -> Result<(), DbErr> { .. } // new
House Keeping
- Cleanup legacy
ActiveValue::Sethttps://github.com/SeaQL/sea-orm/pull/2515
1.1.6 - 2025-02-24
New Features
- Support PgVector (under feature flag
postgres-vector) https://github.com/SeaQL/sea-orm/pull/2500
// Model
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
#[sea_orm(table_name = "image_model")]
pub struct Model {
#[sea_orm(primary_key, auto_increment = false)]
pub id: i32,
pub embedding: PgVector,
}
// Schema
sea_query::Table::create()
.table(image_model::Entity.table_ref())
.col(ColumnDef::new(Column::Id).integer().not_null().primary_key())
.col(ColumnDef::new(Column::Embedding).vector(None).not_null())
..
// Insert
ActiveModel {
id: NotSet,
embedding: Set(PgVector::from(vec![1., 2., 3.])),
}
.insert(db)
.await?
- Added
Insert::exec_with_returning_keys&Insert::exec_with_returning_many(Postgres only)
assert_eq!(
Entity::insert_many([
ActiveModel { id: NotSet, name: Set("two".into()) },
ActiveModel { id: NotSet, name: Set("three".into()) },
])
.exec_with_returning_many(db)
.await
.unwrap(),
[
Model { id: 2, name: "two".into() },
Model { id: 3, name: "three".into() },
]
);
assert_eq!(
cakes_bakers::Entity::insert_many([
cakes_bakers::ActiveModel {
cake_id: Set(1),
baker_id: Set(2),
},
cakes_bakers::ActiveModel {
cake_id: Set(2),
baker_id: Set(1),
},
])
.exec_with_returning_keys(db)
.await
.unwrap(),
[(1, 2), (2, 1)]
);
- Added
DeleteOne::exec_with_returning&DeleteMany::exec_with_returninghttps://github.com/SeaQL/sea-orm/pull/2432
Enhancements
- Expose underlying row types (e.g.
sqlx::postgres::PgRow) https://github.com/SeaQL/sea-orm/pull/2265 - [sea-orm-cli] Added
acquire-timeoutoption https://github.com/SeaQL/sea-orm/pull/2461 - [sea-orm-cli] Added
with-preludeoption https://github.com/SeaQL/sea-orm/pull/2322 - [sea-orm-cli] Added
impl-active-model-behavioroption https://github.com/SeaQL/sea-orm/pull/2487
Bug Fixes
- Fixed
seaography::register_active_enumsmacro https://github.com/SeaQL/sea-orm/pull/2475
House keeping
- Remove
futurescrate, replace withfutures-utilhttps://github.com/SeaQL/sea-orm/pull/2466
1.1.5 - 2025-02-14
New Features
- Added
Schema::json_schema_from_entityto construct a schema description in json for the given Entity
1.1.4 - 2025-01-10
Enhancements
- Allow modifying the connection in migrations https://github.com/SeaQL/sea-orm/pull/2397
DeriveRelatedEntityproc_macro useasync-graphqlre-exported byseaographyhttps://github.com/SeaQL/sea-orm/pull/2469
1.1.3 - 2024-12-24
New Features
- [sea-orm-codegen] register seaography entity modules & active enums https://github.com/SeaQL/sea-orm/pull/2403
pub mod prelude;
pub mod sea_orm_active_enums;
pub mod baker;
pub mod bakery;
pub mod cake;
pub mod cakes_bakers;
pub mod customer;
pub mod lineitem;
pub mod order;
seaography::register_entity_modules!([
baker,
bakery,
cake,
cakes_bakers,
customer,
lineitem,
order,
]);
seaography::register_active_enums!([
sea_orm_active_enums::Tea,
sea_orm_active_enums::Color,
]);
Enhancements
- Insert many allow active models to have different column set https://github.com/SeaQL/sea-orm/pull/2433
// this previously panics
let apple = cake_filling::ActiveModel {
cake_id: ActiveValue::set(2),
filling_id: ActiveValue::NotSet,
};
let orange = cake_filling::ActiveModel {
cake_id: ActiveValue::NotSet,
filling_id: ActiveValue::set(3),
};
assert_eq!(
Insert::<cake_filling::ActiveModel>::new()
.add_many([apple, orange])
.build(DbBackend::Postgres)
.to_string(),
r#"INSERT INTO "cake_filling" ("cake_id", "filling_id") VALUES (2, NULL), (NULL, 3)"#,
);
- [sea-orm-cli] Added
MIGRATION_DIRenvironment variable https://github.com/SeaQL/sea-orm/pull/2419 - Added
ColumnDef::is_uniquehttps://github.com/SeaQL/sea-orm/pull/2401 - Postgres: quote schema in
search_pathhttps://github.com/SeaQL/sea-orm/pull/2436
Bug Fixes
- MySQL: fix transaction isolation level not respected when used with access mode https://github.com/SeaQL/sea-orm/pull/2450
1.1.2 - 2024-12-02
Enhancements
- Added
ColumnTrait::enum_type_name()to signify enum types https://github.com/SeaQL/sea-orm/pull/2415 - Added
DbBackend::boolean_value()for database dependent boolean value https://github.com/SeaQL/sea-orm/pull/2415
1.1.1 - 2024-11-04
Enhancements
- [sea-orm-macros]
impl From<Model> for ActiveModelinstead ofimpl From<<Entity as sea_orm::EntityTrait>::Model> for ActiveModelhttps://github.com/SeaQL/sea-orm/pull/2349. Now the following can compile:
use sea_orm::{tests_cfg::cake, Set};
struct Cake {
id: i32,
name: String,
}
impl From<Cake> for cake::ActiveModel {
fn from(value: Cake) -> Self {
Self {
id: Set(value.id),
name: Set(value.name),
}
}
}
1.1.0 - 2024-10-15
Versions
1.1.0-rc.1: 2024-08-091.1.0-rc.2: 2024-10-041.1.0-rc.3: 2024-10-08
Enhancements
- [sea-orm-macros] Call
EnumIter::getusing fully qualified syntax https://github.com/SeaQL/sea-orm/pull/2321 - Construct
DatabaseConnectiondirectly fromsqlx::PgPool,sqlx::SqlitePoolandsqlx::MySqlPoolhttps://github.com/SeaQL/sea-orm/pull/2348 - [sea-orm-migration] Add
pk_uuidschema helper https://github.com/SeaQL/sea-orm/pull/2329 - [sea-orm-migration] Allow
customandcustom_nullschema helper to take column name and alias of differentIntoIdentypes https://github.com/SeaQL/sea-orm/pull/2326 - Add
ColumnDef::get_column_defaultgetter https://github.com/SeaQL/sea-orm/pull/2387
Upgrades
- Upgrade
sqlxto0.8.2https://github.com/SeaQL/sea-orm/pull/2305, https://github.com/SeaQL/sea-orm/pull/2371 - Upgrade
bigdecimalto0.4https://github.com/SeaQL/sea-orm/pull/2305 - Upgrade
sea-queryto0.32.0-rchttps://github.com/SeaQL/sea-orm/pull/2305 - Upgrade
sea-query-binderto0.7.0-rchttps://github.com/SeaQL/sea-orm/pull/2305 - Upgrade
sea-schemato0.16.0-rchttps://github.com/SeaQL/sea-orm/pull/2305 - Upgrade
ouroborosto0.18https://github.com/SeaQL/sea-orm/pull/2353
House keeping
- Fix typos https://github.com/SeaQL/sea-orm/pull/2360
- Update documentations https://github.com/SeaQL/sea-orm/pull/2345
1.0.1 - 2024-08-26
New Features
- Added
ConnectOptions::connect_lazyfor creating DB connection pools without establishing connections up front https://github.com/SeaQL/sea-orm/pull/2268
Breaking Changes
- Changed
ProxyDatabaseTraitmethods to async. It's a breaking change, but it should have been part of the 1.0 release. The feature is behind the feature guardproxy, and we believe it shouldn't impact majority of users. https://github.com/SeaQL/sea-orm/pull/2278
Bug Fixes
- [sea-orm-codegen] Fix
ColumnTypeto Rust type resolution https://github.com/SeaQL/sea-orm/pull/2313
1.0.0 - 2024-08-02
Versions
1.0.0-rc.1: 2024-02-061.0.0-rc.2: 2024-03-151.0.0-rc.3: 2024-03-261.0.0-rc.4: 2024-05-131.0.0-rc.5: 2024-05-291.0.0-rc.6: 2024-06-191.0.0-rc.7: 2024-06-25
New Features
- Introduce
PrimaryKeyAritywithARITYconstant https://github.com/SeaQL/sea-orm/pull/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
ActiveModeltoEntityTraithttps://github.com/SeaQL/sea-orm/pull/2186 - [sea-orm-macros] Added
rename_allattribute toDeriveEntityModel&DeriveActiveEnumhttps://github.com/SeaQL/sea-orm/pull/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
}
- [sea-orm-migration] schema helper https://github.com/SeaQL/sea-orm/pull/2099
// 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 https://github.com/SeaQL/sea-orm/pull/2256
- Added
QuerySelect::tbl_col_as - Added
Insert::on_conflict_do_nothinghttps://github.com/SeaQL/sea-orm/pull/2244 - Migration schema nullable column set NULL explicitly https://github.com/SeaQL/sea-orm/pull/2255
- Added
ActiveValue::set_if_not_equals()https://github.com/SeaQL/sea-orm/pull/2194 - Added
ActiveValue::try_as_ref()https://github.com/SeaQL/sea-orm/pull/2197 - Added
QuerySelect::order_by_with_nullshttps://github.com/SeaQL/sea-orm/pull/2228 - Expose
get_xxx_connection_poolby default https://github.com/SeaQL/sea-orm/pull/2233 - Added
QueryResult::column_nameshttps://github.com/SeaQL/sea-orm/pull/2148 - [sea-orm-macro] Add
@generatedin generated code https://github.com/SeaQL/sea-orm/pull/2199 - [sea-orm-macro] Qualify traits in
DeriveActiveModelmacro https://github.com/SeaQL/sea-orm/pull/1665 - [sea-orm-cli] Fix
migrate generateon emptymod.rsfiles https://github.com/SeaQL/sea-orm/pull/2064 DerivePartialModelmacro attributeentitynow supportssyn::Typehttps://github.com/SeaQL/sea-orm/pull/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,
}
- Added
RelationDef::from_alias()https://github.com/SeaQL/sea-orm/pull/2146
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 https://github.com/SeaQL/sea-orm/pull/2241
- [sea-orm-cli] Generate
has_onerelation for foreign key of unique index / constraint https://github.com/SeaQL/sea-orm/pull/2254
Breaking changes
- Renamed
ConnectOptions::pool_options()toConnectOptions::sqlx_pool_options()https://github.com/SeaQL/sea-orm/pull/2145 - Made
sqlx_commonprivate, hidingsqlx_error_to_xxx_errhttps://github.com/SeaQL/sea-orm/pull/2145 - Rework SQLite type mappings https://github.com/SeaQL/sea-orm/pull/2077, https://github.com/SeaQL/sea-orm/pull/2078
Upgrades
- Upgrade
timeto0.3.36https://github.com/SeaQL/sea-orm/pull/2267 - Upgrade
strumto0.26https://github.com/SeaQL/sea-orm/pull/2088 - Upgrade
sea-schemato0.15.0 - Upgrade
sea-query-binderto0.6.0 - Upgrade
sea-queryto0.31.0
House keeping
- Reduce warnings in integration tests https://github.com/SeaQL/sea-orm/pull/2177
- Improved Actix example to return 404 not found on unexpected inputs https://github.com/SeaQL/sea-orm/pull/2140
- Re-enable
rocket_okapiexample https://github.com/SeaQL/sea-orm/pull/2136
1.0.0-rc.7 - 2024-06-25
Upgrades
- Upgrade
sea-query-binderto0.6.0-rc.4https://github.com/SeaQL/sea-orm/pull/2267 - Upgrade
timeto0.3.36https://github.com/SeaQL/sea-orm/pull/2267
1.0.0-rc.6 - 2024-06-19
Enhancements
- Added non-TLS runtime https://github.com/SeaQL/sea-orm/pull/2256
- Added
QuerySelect::tbl_col_as - Added
Insert::on_conflict_do_nothinghttps://github.com/SeaQL/sea-orm/pull/2244 - Migration schema nullable column set NULL explicitly https://github.com/SeaQL/sea-orm/pull/2255
Bug Fixes
- Set schema search path in Postgres without enclosing single quote https://github.com/SeaQL/sea-orm/pull/2241
- [sea-orm-cli] Generate
has_onerelation for foreign key of unique index / constraint https://github.com/SeaQL/sea-orm/pull/2254
1.0.0-rc.5 - 2024-05-29
New Features
- Introduce
PrimaryKeyAritywithARITYconstant https://github.com/SeaQL/sea-orm/pull/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
ActiveModeltoEntityTraithttps://github.com/SeaQL/sea-orm/pull/2186 - [sea-orm-macros] Added
rename_allattribute toDeriveEntityModel&DeriveActiveEnumhttps://github.com/SeaQL/sea-orm/pull/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
- Added
ActiveValue::set_if_not_equals()https://github.com/SeaQL/sea-orm/pull/2194 - Added
ActiveValue::try_as_ref()https://github.com/SeaQL/sea-orm/pull/2197 - Added
QuerySelect::order_by_with_nullshttps://github.com/SeaQL/sea-orm/pull/2228 - Expose
get_xxx_connection_poolby default https://github.com/SeaQL/sea-orm/pull/2233
1.0.0-rc.4 - 2024-05-13
Enhancements
- Added
QueryResult::column_nameshttps://github.com/SeaQL/sea-orm/pull/2148 - [sea-orm-macro] Add
@generatedin generated code https://github.com/SeaQL/sea-orm/pull/2199
Upgrades
- Upgrade
sea-queryto0.31.0-rc.6 - Upgrade
sea-schemato0.15.0-rc.6
House Keeping
- Reduce warnings in integration tests https://github.com/SeaQL/sea-orm/pull/2177
1.0.0-rc.3 - 2024-03-26
Enhancements
- [sea-orm-macro] Qualify traits in
DeriveActiveModelmacro https://github.com/SeaQL/sea-orm/pull/1665
1.0.0-rc.2 - 2024-03-15
Breaking Changes
- Renamed
ConnectOptions::pool_options()toConnectOptions::sqlx_pool_options()https://github.com/SeaQL/sea-orm/pull/2145 - Made
sqlx_commonprivate, hidingsqlx_error_to_xxx_errhttps://github.com/SeaQL/sea-orm/pull/2145
Enhancements
- [sea-orm-cli] Fix
migrate generateon emptymod.rsfiles https://github.com/SeaQL/sea-orm/pull/2064 DerivePartialModelmacro attributeentitynow supportssyn::Typehttps://github.com/SeaQL/sea-orm/pull/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,
}
- Added
RelationDef::from_alias()https://github.com/SeaQL/sea-orm/pull/2146
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-schemato0.15.0-rc.3 - Upgrade
strumto0.26https://github.com/SeaQL/sea-orm/pull/2088
House keeping
- Improved Actix example to return 404 not found on unexpected inputs https://github.com/SeaQL/sea-orm/pull/2140
- Re-enable
rocket_okapiexample https://github.com/SeaQL/sea-orm/pull/2136
1.0.0-rc.1 - 2024-02-06
New Features
- [sea-orm-migration] schema helper https://github.com/SeaQL/sea-orm/pull/2099
// 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
- Rework SQLite type mappings https://github.com/SeaQL/sea-orm/pull/2077, https://github.com/SeaQL/sea-orm/pull/2078
- Updated
sea-queryto0.31
0.12.14 - 2024-02-05
- Added feature flag
sqlite-use-returning-for-3_35to use SQLite's returning https://github.com/SeaQL/sea-orm/pull/2070 - Added Loco example https://github.com/SeaQL/sea-orm/pull/2092
0.12.12 - 2024-01-22
Bug Fixes
- [sea-orm-cli] Fix entity generation for non-alphanumeric enum variants https://github.com/SeaQL/sea-orm/pull/1821
- [sea-orm-cli] Fix entity generation for relations with composite keys https://github.com/SeaQL/sea-orm/pull/2071
Enhancements
- Added
ConnectOptions::test_before_acquire
0.12.11 - 2024-01-14
New Features
- Added
desctoCursorpaginator https://github.com/SeaQL/sea-orm/pull/2037
Enhancements
- Improve query performance of
Paginator'sCOUNTquery https://github.com/SeaQL/sea-orm/pull/2030 - Added SQLx slow statements logging to
ConnectOptionshttps://github.com/SeaQL/sea-orm/pull/2055 - Added
QuerySelect::lock_with_behaviorhttps://github.com/SeaQL/sea-orm/pull/1867
Bug Fixes
- [sea-orm-macro] Qualify types in
DeriveValueTypemacro https://github.com/SeaQL/sea-orm/pull/2054
House keeping
- Fix clippy warnings on 1.75 https://github.com/SeaQL/sea-orm/pull/2057
0.12.10 - 2023-12-14
New Features
- [sea-orm-macro] Comment attribute for Entity (
#[sea_orm(comment = "action")]);create_table_from_entitysupports comment https://github.com/SeaQL/sea-orm/pull/2009 - Added "proxy" (feature flag
proxy) to database backend https://github.com/SeaQL/sea-orm/pull/1881, https://github.com/SeaQL/sea-orm/pull/2000
Enhancements
- Cast enums in
is_inandis_not_inhttps://github.com/SeaQL/sea-orm/pull/2002
Upgrades
- Updated
sea-queryto0.30.5https://github.com/SeaQL/sea-query/releases/tag/0.30.5
0.12.9 - 2023-12-08
Enhancements
- Add source annotations to errors https://github.com/SeaQL/sea-orm/pull/1999
Upgrades
- Updated
sea-queryto0.30.4https://github.com/SeaQL/sea-query/releases/tag/0.30.4
0.12.8 - 2023-12-04
Enhancements
- Implement
StatementBuilderforsea_query::WithQueryhttps://github.com/SeaQL/sea-orm/issues/1960
Upgrades
- Upgrade
axumexample to0.7https://github.com/SeaQL/sea-orm/pull/1984
0.12.7 - 2023-11-22
Enhancements
- Added method
expr_as_that acceptsselfhttps://github.com/SeaQL/sea-orm/pull/1979
Upgrades
- Updated
sea-queryto0.30.3https://github.com/SeaQL/sea-query/releases/tag/0.30.3
0.12.6 - 2023-11-13
New Features
- Added
#[sea_orm(skip)]forFromQueryResultderive macro https://github.com/SeaQL/sea-orm/pull/1954
0.12.5 - 2023-11-12
Bug Fixes
- [sea-orm-cli] Fix duplicated active enum use statements on generated entities https://github.com/SeaQL/sea-orm/pull/1953
- [sea-orm-cli] Added
--enum-extra-deriveshttps://github.com/SeaQL/sea-orm/pull/1934 - [sea-orm-cli] Added
--enum-extra-attributeshttps://github.com/SeaQL/sea-orm/pull/1952
0.12.4 - 2023-10-19
New Features
- Add support for root JSON arrays https://github.com/SeaQL/sea-orm/pull/1898
Now the following works (requires the
json-array/postgres-arrayfeature)!
#[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
- Loader: use
ValueTupleas hash key https://github.com/SeaQL/sea-orm/pull/1868
Upgrades
- Updated
sea-queryto0.30.2https://github.com/SeaQL/sea-query/releases/tag/0.30.2
0.12.3 - 2023-09-22
New Features
- [sea-orm-migration] Check if an index exists https://github.com/SeaQL/sea-orm/pull/1828
- Added
cursor_bytoSelectTwohttps://github.com/SeaQL/sea-orm/pull/1826
Enhancements
- [sea-orm-cli] Support generation of related entity with composite foreign key https://github.com/SeaQL/sea-orm/pull/1693
Bug Fixes
- [sea-orm-macro] Fixed
DeriveValueTypeby qualifyingQueryResulthttps://github.com/SeaQL/sea-orm/pull/1855 - Fixed
Loaderpanic on empty inputs
Upgrades
- Upgraded
salvoto0.50 - Upgraded
chronoto0.4.30https://github.com/SeaQL/sea-orm/pull/1858 - Updated
sea-queryto0.30.1 - Updated
sea-schemato0.14.1
House keeping
- Added test cases for
find_xxx_related/linkedhttps://github.com/SeaQL/sea-orm/pull/1811
0.12.2 - 2023-08-04
Enhancements
- Added support for Postgres arrays in
FromQueryResultimpl ofJsonValuehttps://github.com/SeaQL/sea-orm/pull/1598
Bug fixes
- Fixed
find_with_relatedconsolidation logic https://github.com/SeaQL/sea-orm/issues/1800
0.12.1 - 2023-07-27
0.12.0-rc.1: Yanked0.12.0-rc.2: 2023-05-190.12.0-rc.3: 2023-06-220.12.0-rc.4: 2023-07-080.12.0-rc.5: 2023-07-22
New Features
- Added
MigratorTrait::migration_table_name()method to configure the name of migration table https://github.com/SeaQL/sea-orm/pull/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 https://github.com/SeaQL/sea-orm/pull/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 https://github.com/SeaQL/sea-orm/pull/1508
Identitysupports tuple ofDynIdenwith 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,
}
- Added macro
DerivePartialModelhttps://github.com/SeaQL/sea-orm/pull/1597
#[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 errorsSqlErr, such as unique constraint or foreign key violation errors. https://github.com/SeaQL/sea-orm/pull/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(_))
));
- Added
Select::find_with_linked, similar tofind_with_related: https://github.com/SeaQL/sea-orm/pull/1728, https://github.com/SeaQL/sea-orm/pull/1743
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
DeriveValueTypederive macro for custom wrapper types, implementations of the required traits will be provided, you can customize thecolumn_typeandarray_typeif needed https://github.com/SeaQL/sea-orm/pull/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
DeriveDisplayderive macro to implementsstd::fmt::Displayfor enum https://github.com/SeaQL/sea-orm/pull/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()https://github.com/SeaQL/sea-orm/pull/1677
let models: Vec<Model> = Entity::update_many()
.col_expr(Column::Values, Expr::expr(..))
.exec_with_returning(db)
.await?;
- Supporting
default_exprinDeriveEntityModelhttps://github.com/SeaQL/sea-orm/pull/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())
);
- Introduced new
ConnAcquireErrhttps://github.com/SeaQL/sea-orm/pull/1737
enum DbErr {
ConnectionAcquire(ConnAcquireErr),
..
}
enum ConnAcquireErr {
Timeout,
ConnectionClosed,
}
Seaography
Added Seaography integration https://github.com/SeaQL/sea-orm/pull/1599
-
Added
DeriveEntityRelatedmacro which will implementseaography::RelationBuilderforRelatedEntityenumeration when theseaographyfeature is enabled -
Added generation of
seaographyrelated information tosea-orm-codegen.The
RelatedEntityenum is added in entities files bysea-orm-cliwhen flagseaographyis 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,
}
- Added
seaography_example
Enhancements
- Supports for partial select of
Option<T>model field. ANonevalue will be filled when the select result does not contain theOption<T>field without throwing an error. https://github.com/SeaQL/sea-orm/pull/1513 - [sea-orm-cli] the
migrate initcommand will create a.gitignorefile when the migration folder reside in a Git repository https://github.com/SeaQL/sea-orm/pull/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 createm20230503_000000_create_accounts_table.rsfor you https://github.com/SeaQL/sea-orm/pull/1570 - Added
Migration::name()andMigration::status()getters for the name and status ofsea_orm_migration::Migrationhttps://github.com/SeaQL/sea-orm/pull/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-arrayfeature will be enabled whensqlx-postgresbackend is selected https://github.com/SeaQL/sea-orm/pull/1565 - Replace
Stringparameters in API withInto<String>https://github.com/SeaQL/sea-orm/pull/1439- Implements
IntoMockRowfor anyBTreeMapthat is indexed by stringimpl 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()andColumnTrait::contains()to takes any string
- Implements
- Added
sea_query::{DynIden, RcOrArc, SeaRc}to entity prelude https://github.com/SeaQL/sea-orm/pull/1661 - Added
expr,exprsandexpr_asmethods toQuerySelecttrait https://github.com/SeaQL/sea-orm/pull/1702 - Added
DatabaseConnection::pinghttps://github.com/SeaQL/sea-orm/pull/1627
|db: DatabaseConnection| {
assert!(db.ping().await.is_ok());
db.clone().close().await;
assert!(matches!(db.ping().await, Err(DbErr::ConnectionAcquire)));
}
- Added
TryInsertthat does not panic on empty inserts https://github.com/SeaQL/sea-orm/pull/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 https://github.com/SeaQL/sea-orm/pull/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
DeriveActiveEnumthrowing errors becausestring_valueconsists non-UAX#31 compliant characters https://github.com/SeaQL/sea-orm/pull/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 https://github.com/SeaQL/sea-orm/pull/1678
- [sea-orm-cli] The implementation of
Related<R>withviaandtomethods will not be generated if there exists multiple paths via an intermediate table https://github.com/SeaQL/sea-orm/pull/1435 - [sea-orm-cli] fixed entity generation includes partitioned tables https://github.com/SeaQL/sea-orm/issues/1582, https://github.com/SeaQL/sea-schema/pull/105
- Fixed
ActiveEnum::db_type()return type does not implementColumnTypeTraithttps://github.com/SeaQL/sea-orm/pull/1576 - Resolved
insert_manyfailing if the models iterator is empty https://github.com/SeaQL/sea-orm/issues/873
Breaking changes
- Supports for partial select of
Option<T>model field. ANonevalue will be filled when the select result does not contain theOption<T>field instead of throwing an error. https://github.com/SeaQL/sea-orm/pull/1513 - Replaced
sea-strumdependency with upstreamstruminsea-ormhttps://github.com/SeaQL/sea-orm/pull/1535- Added
deriveandstrumfeatures tosea-orm-macros - The derive macro
EnumIteris now shipped bysea-orm-macros
- Added
- Added a new variant
ManytoIdentityhttps://github.com/SeaQL/sea-orm/pull/1508 - Enabled
hashable-valuefeature in SeaQuery, thusValue::Float(NaN) == Value::Float(NaN)would be true https://github.com/SeaQL/sea-orm/pull/1728, https://github.com/SeaQL/sea-orm/pull/1743 - The
DeriveActiveEnumderive macro no longer implementstd::fmt::Display. You can use the newDeriveDisplaymacro https://github.com/SeaQL/sea-orm/pull/1726 sea-query/deriveis no longer enabled bysea-orm, as such,Idenno longer works as a derive macro (it's still a trait). Instead, we are shipping a new macroDeriveIdenhttps://github.com/SeaQL/sea-orm/pull/1740 https://github.com/SeaQL/sea-orm/pull/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::ConnectionAcquirechanged toConnectionAcquire(ConnAcquireErr)https://github.com/SeaQL/sea-orm/pull/1737 FromJsonQueryResultremoved from entity prelude
Upgrades
- Upgraded
sqlxto0.7https://github.com/SeaQL/sea-orm/pull/1742 - Upgraded
sea-queryto0.30https://github.com/SeaQL/sea-orm/pull/1742 - Upgraded
sea-schemato0.14https://github.com/SeaQL/sea-orm/pull/1742 - Upgraded
synto2https://github.com/SeaQL/sea-orm/pull/1713 - Upgraded
heckto0.4https://github.com/SeaQL/sea-orm/pull/1520, https://github.com/SeaQL/sea-orm/pull/1544 - Upgraded
strumto0.25https://github.com/SeaQL/sea-orm/pull/1752 - Upgraded
clapto4.3https://github.com/SeaQL/sea-orm/pull/1468 - Upgraded
ouroborosto0.17https://github.com/SeaQL/sea-orm/pull/1724
House keeping
- Replaced
baewithsea-baehttps://github.com/SeaQL/sea-orm/pull/1739
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::ConnectionTraitinsea_orm_migration::preludehttps://github.com/SeaQL/sea-orm/pull/1577 - Support generic structs in
FromQueryResultderive macro https://github.com/SeaQL/sea-orm/pull/1464, https://github.com/SeaQL/sea-orm/pull/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
- Fixed https://github.com/SeaQL/sea-orm/issues/1608 by pinning the version of
tracing-subscriberdependency to 0.3.17 https://github.com/SeaQL/sea-orm/pull/1609
0.11.2 - 2023-03-25
Enhancements
- Enable required
synfeatures https://github.com/SeaQL/sea-orm/pull/1556 - Re-export
sea_query::BlobSizeinsea_orm::entity::preludehttps://github.com/SeaQL/sea-orm/pull/1548
0.11.1 - 2023-03-10
Bug Fixes
- Fixes
DeriveActiveEnum(by qualifyingColumnTypeTrait::def) https://github.com/SeaQL/sea-orm/issues/1478 - The CLI command
sea-orm-cli generate entity -u '<DB-URL>'will now generate the following code for eachBinaryorVarBinarycolumns in compact format https://github.com/SeaQL/sea-orm/pull/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-formatwill now generate the following code for eachBinaryorVarBinarycolumns in expanded format https://github.com/SeaQL/sea-orm/pull/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(),
}
}
}
- Fix missing documentation on type generated by derive macros https://github.com/SeaQL/sea-orm/pull/1522, https://github.com/SeaQL/sea-orm/pull/1531
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 https://github.com/SeaQL/sea-orm/pull/1238, https://github.com/SeaQL/sea-orm/pull/1443
- Transactions Isolation level and Access mode https://github.com/SeaQL/sea-orm/pull/1230
- Support various UUID formats that are available in
uuid::fmtmodule https://github.com/SeaQL/sea-orm/pull/1325 - Support Vector of enum for Postgres https://github.com/SeaQL/sea-orm/pull/1210
- Support
ActiveEnumfield as primary key https://github.com/SeaQL/sea-orm/pull/1414 - Casting columns as a different data type on select, insert and update https://github.com/SeaQL/sea-orm/pull/1304
- Methods of
ActiveModelBehaviorreceive db connection as a parameter https://github.com/SeaQL/sea-orm/pull/1145, https://github.com/SeaQL/sea-orm/pull/1328 - Added
execute_unpreparedmethod toDatabaseConnectionandDatabaseTransactionhttps://github.com/SeaQL/sea-orm/pull/1327 - Added
Select::into_tupleto select rows as tuples (instead of defining a custom Model) https://github.com/SeaQL/sea-orm/pull/1311
SeaORM CLI
- Generate
#[serde(skip_deserializing)]for primary key columns https://github.com/SeaQL/sea-orm/pull/846, https://github.com/SeaQL/sea-orm/pull/1186, https://github.com/SeaQL/sea-orm/pull/1318 - Generate
#[serde(skip)]for hidden columns https://github.com/SeaQL/sea-orm/pull/1171, https://github.com/SeaQL/sea-orm/pull/1320 - Generate entity with extra derives and attributes for model struct https://github.com/SeaQL/sea-orm/pull/1124, https://github.com/SeaQL/sea-orm/pull/1321
SeaORM Migration
- Migrations are now performed inside a transaction for Postgres https://github.com/SeaQL/sea-orm/pull/1379
Enhancements
- Refactor schema module to expose functions for database alteration https://github.com/SeaQL/sea-orm/pull/1256
- Generate compact entity with
#[sea_orm(column_type = "JsonBinary")]macro attribute https://github.com/SeaQL/sea-orm/pull/1346 MockDatabase::append_exec_results(),MockDatabase::append_query_results(),MockDatabase::append_exec_errors()andMockDatabase::append_query_errors()take any types implementedIntoIteratortrait https://github.com/SeaQL/sea-orm/pull/1367find_by_idanddelete_by_idtake anyIntoprimary key value https://github.com/SeaQL/sea-orm/pull/1362QuerySelect::offsetandQuerySelect::limittakes inInto<Option<u64>>whereNonewould reset them https://github.com/SeaQL/sea-orm/pull/1410- Added
DatabaseConnection::closehttps://github.com/SeaQL/sea-orm/pull/1236 - Added
is_nullgetter forColumnDefhttps://github.com/SeaQL/sea-orm/pull/1381 - Added
ActiveValue::resetto convertUnchangedintoSethttps://github.com/SeaQL/sea-orm/pull/1177 - Added
QueryTrait::apply_ifto optionally apply a filter https://github.com/SeaQL/sea-orm/pull/1415 - Added the
sea-orm-internalfeature flag to expose some SQLx types- Added
DatabaseConnection::get_*_connection_pool()for accessing the inner SQLx connection pool https://github.com/SeaQL/sea-orm/pull/1297 - Re-exporting SQLx errors https://github.com/SeaQL/sea-orm/pull/1434
- Added
Upgrades
- Upgrade
axumto0.6.1https://github.com/SeaQL/sea-orm/pull/1285 - Upgrade
sea-queryto0.28https://github.com/SeaQL/sea-orm/pull/1366 - Upgrade
sea-query-binderto0.3https://github.com/SeaQL/sea-orm/pull/1366 - Upgrade
sea-schemato0.11https://github.com/SeaQL/sea-orm/pull/1366
House Keeping
- Fixed all clippy warnings as of
1.67.0https://github.com/SeaQL/sea-orm/pull/1426 - Removed dependency where not needed https://github.com/SeaQL/sea-orm/pull/1213
- Disabled default features and enabled only the needed ones https://github.com/SeaQL/sea-orm/pull/1300
- Cleanup panic and unwrap https://github.com/SeaQL/sea-orm/pull/1231
- Cleanup the use of
vec!macro https://github.com/SeaQL/sea-orm/pull/1367
Bug Fixes
- [sea-orm-cli] Propagate error on the spawned child processes https://github.com/SeaQL/sea-orm/pull/1402
- Fixes sea-orm-cli errors exit with error code 0 https://github.com/SeaQL/sea-orm/issues/1342
- Fixes
DeriveColumn(by qualifyingIdenStatic::as_str) https://github.com/SeaQL/sea-orm/pull/1280 - Prevent returning connections to pool with a positive transaction depth https://github.com/SeaQL/sea-orm/pull/1283
- Postgres insert many will throw
RecordNotInsertederror if non of them are being inserted https://github.com/SeaQL/sea-orm/pull/1021- Fixes inserting active models by
insert_manywithon_conflictanddo_nothingpanics if no rows are inserted on Postgres https://github.com/SeaQL/sea-orm/issues/899
- Fixes inserting active models by
- Don't call
last_insert_idif not needed https://github.com/SeaQL/sea-orm/pull/1403- Fixes hitting 'negative last_insert_rowid' panic with Sqlite https://github.com/SeaQL/sea-orm/issues/1357
- Noop when update without providing any values https://github.com/SeaQL/sea-orm/pull/1384
- Fixes Syntax Error when saving active model that sets nothing https://github.com/SeaQL/sea-orm/pull/1376
Breaking Changes
- [sea-orm-cli] Enable --universal-time by default https://github.com/SeaQL/sea-orm/pull/1420
- Added
RecordNotInsertedandRecordNotUpdatedtoDbErr - Added
ConnectionTrait::execute_unpreparedmethod https://github.com/SeaQL/sea-orm/pull/1327 - As part of https://github.com/SeaQL/sea-orm/pull/1311, the required method of
TryGetablechanged:
// 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
ActiveModelBehaviortrait becomes async trait https://github.com/SeaQL/sea-orm/pull/1328. If you overridden the defaultActiveModelBehaviorimplementation:
#[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 variantDbErr::RecordNotUpdatedhttps://github.com/SeaQL/sea-orm/pull/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::ColumnTypewas replaced bysea_query::ColumnTypehttps://github.com/SeaQL/sea-orm/pull/1395- Method
ColumnType::defwas moved toColumnTypeTrait ColumnType::Binarybecomes a tuple variant which takes in additional optionsea_query::BlobSizeColumnType::Customtakes asea_query::DynIdeninstead ofStringand thus a new methodcustomis added (note the lowercase)
- Method
// 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
- Fixed a small typo https://github.com/SeaQL/sea-orm/pull/1391
axumexample should use tokio runtime https://github.com/SeaQL/sea-orm/pull/1428
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_manywithon_conflictanddo_nothingpanics if no rows are inserted on Postgres https://github.com/SeaQL/sea-orm/issues/899 - Hitting 'negative last_insert_rowid' panic with Sqlite https://github.com/SeaQL/sea-orm/issues/1357
0.10.6 - 2022-12-23
Enhancements
- Cast enum values when constructing update many query https://github.com/SeaQL/sea-orm/pull/1178
Bug Fixes
- Fixes
DeriveColumn(by qualifyingIdenStatic::as_str) https://github.com/SeaQL/sea-orm/pull/1280 - Prevent returning connections to pool with a positive transaction depth https://github.com/SeaQL/sea-orm/pull/1283
- [sea-orm-codegen] Skip implementing Related if the same related entity is being referenced by a conjunct relation https://github.com/SeaQL/sea-orm/pull/1298
- [sea-orm-cli] CLI depends on codegen of the same version https://github.com/SeaQL/sea-orm/pull/1299/
0.10.5 - 2022-12-02
New Features
- Add
QuerySelect::columnsmethod - select multiple columns https://github.com/SeaQL/sea-orm/pull/1264 - Transactions Isolation level and Access mode https://github.com/SeaQL/sea-orm/pull/1230
Bug Fixes
DeriveEntityModelderive macro: when parsing field type, always treat field withOption<T>as nullable column https://github.com/SeaQL/sea-orm/pull/1257
Enhancements
- [sea-orm-cli] Generate
Relatedimplementation for many-to-many relation with extra columns https://github.com/SeaQL/sea-orm/pull/1260 - Optimize the default implementation of
TryGetableFromJson::try_get_from_json()- deserializing intoSelfdirectly without the need of a intermediateserde_json::Valuehttps://github.com/SeaQL/sea-orm/pull/1249
0.10.4 - 2022-11-24
Bug Fixes
- Fix DeriveActiveEnum expand enum variant starts with number https://github.com/SeaQL/sea-orm/pull/1219
- [sea-orm-cli] Generate entity file for specified tables only https://github.com/SeaQL/sea-orm/pull/1245
- Support appending
DbErrtoMockDatabasehttps://github.com/SeaQL/sea-orm/pull/1241
Enhancements
- Filter rows with
IS INenum values expression https://github.com/SeaQL/sea-orm/pull/1183 - [sea-orm-cli] Generate entity with relation variant order by name of reference table https://github.com/SeaQL/sea-orm/pull/1229
0.10.3 - 2022-11-14
Bug Fixes
- [sea-orm-cli] Set search path when initializing Postgres connection for CLI generate entity https://github.com/SeaQL/sea-orm/pull/1212
- [sea-orm-cli] Generate
_prefix to enum variant starts with number https://github.com/SeaQL/sea-orm/pull/1211 - Fix composite key cursor pagination https://github.com/SeaQL/sea-orm/pull/1216
- The logic for single-column primary key was correct, but for composite keys the logic was incorrect
Enhancements
- Added
Insert::exec_without_returninghttps://github.com/SeaQL/sea-orm/pull/1208
House Keeping
- Remove dependency when not needed https://github.com/SeaQL/sea-orm/pull/1207
0.10.2 - 2022-11-06
Enhancements
- [sea-orm-rocket] added
sqlx_loggingtoConfighttps://github.com/SeaQL/sea-orm/pull/1192 - Collecting metrics for
query_one/allhttps://github.com/SeaQL/sea-orm/pull/1165 - Use GAT to elide
StreamTraitlifetime https://github.com/SeaQL/sea-orm/pull/1161
Bug Fixes
- corrected the error name
UpdateGetPrimaryKeyhttps://github.com/SeaQL/sea-orm/pull/1180
Upgrades
- Update MSRV to 1.65
0.10.1 - 2022-10-27
Enhancements
- [sea-orm-cli] Escape module name defined with Rust keywords https://github.com/SeaQL/sea-orm/pull/1052
- [sea-orm-cli] Check to make sure migration name doesn't contain hyphen
-in it https://github.com/SeaQL/sea-orm/pull/879, https://github.com/SeaQL/sea-orm/pull/1155 - Support
timecrate for SQLite https://github.com/SeaQL/sea-orm/pull/995
Bug Fixes
- [sea-orm-cli] Generate
Relatedfor m-to-n relation https://github.com/SeaQL/sea-orm/pull/1075 - [sea-orm-cli] Generate model entity with Postgres Enum field https://github.com/SeaQL/sea-orm/pull/1153
- [sea-orm-cli] Migrate up command apply all pending migrations https://github.com/SeaQL/sea-orm/pull/1010
- [sea-orm-cli] Conflicting short flag
-uwhen executingmigrate generatecommand https://github.com/SeaQL/sea-orm/pull/1157 - Prefix the usage of types with
sea_orm::insideDeriveActiveEnumderive macros https://github.com/SeaQL/sea-orm/pull/1146, https://github.com/SeaQL/sea-orm/pull/1154 - [sea-orm-cli] Generate model with
Vec<f32>orVec<f64>should not deriveEqon the model struct https://github.com/SeaQL/sea-orm/pull/1158
House Keeping
- [sea-orm-cli] [sea-orm-migration] Add
clifeature to optionally include dependencies that are required by the CLI https://github.com/SeaQL/sea-orm/pull/978
Upgrades
- Upgrade
sea-schemato 0.10.2 https://github.com/SeaQL/sea-orm/pull/1153
0.10.0 - 2022-10-23
New Features
- Better error types (carrying SQLx Error) https://github.com/SeaQL/sea-orm/pull/1002
- Support array datatype in PostgreSQL https://github.com/SeaQL/sea-orm/pull/1132
- [sea-orm-cli] Generate entity files as a library or module https://github.com/SeaQL/sea-orm/pull/953
- [sea-orm-cli] Generate a new migration template with name prefix of unix timestamp https://github.com/SeaQL/sea-orm/pull/947
- [sea-orm-cli] Generate migration in modules https://github.com/SeaQL/sea-orm/pull/933
- [sea-orm-cli] Generate
DeriveRelationon emptyRelationenum https://github.com/SeaQL/sea-orm/pull/1019 - [sea-orm-cli] Generate entity derive
Eqif possible https://github.com/SeaQL/sea-orm/pull/988 - [sea-orm-cli] Run migration on any PostgreSQL schema https://github.com/SeaQL/sea-orm/pull/1056
Enhancements
- Support
distinct&distinct_onexpression https://github.com/SeaQL/sea-orm/pull/902 fn column()also handle enum type https://github.com/SeaQL/sea-orm/pull/973- Added
acquire_timeoutonConnectOptionshttps://github.com/SeaQL/sea-orm/pull/897 - [sea-orm-cli]
migrate freshcommand will drop all PostgreSQL types https://github.com/SeaQL/sea-orm/pull/864, https://github.com/SeaQL/sea-orm/pull/991 - Better compile error for entity without primary key https://github.com/SeaQL/sea-orm/pull/1020
- Added blanket implementations of
IntoActiveValueforOptionvalues https://github.com/SeaQL/sea-orm/pull/833 - Added
into_model&into_jsontoCursorhttps://github.com/SeaQL/sea-orm/pull/1112 - Added
set_schema_search_pathmethod toConnectOptionsfor setting schema search path of PostgreSQL connection https://github.com/SeaQL/sea-orm/pull/1056 - Serialize
timetypes asserde_json::Valuehttps://github.com/SeaQL/sea-orm/pull/1042 - Implements
fmt::DisplayforActiveEnumhttps://github.com/SeaQL/sea-orm/pull/986 - Implements
TryFrom<ActiveModel>forModelhttps://github.com/SeaQL/sea-orm/pull/990
Bug Fixes
- Trim spaces when paginating raw SQL https://github.com/SeaQL/sea-orm/pull/1094
Breaking Changes
- Replaced
usizewithu64inPaginatorTraithttps://github.com/SeaQL/sea-orm/pull/789 - Type signature of
DbErrchanged as a result of https://github.com/SeaQL/sea-orm/pull/1002 ColumnType::Enumstructure 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_typewas added toValueType:
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 toDynIden:
#[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
- Documentation grammar fixes https://github.com/SeaQL/sea-orm/pull/1050
- Replace
dotenvwithdotenvyin examples https://github.com/SeaQL/sea-orm/pull/1085 - Exclude test_cfg module from SeaORM https://github.com/SeaQL/sea-orm/pull/1077
Integration
- Support
rocket_okapihttps://github.com/SeaQL/sea-orm/pull/1071
Upgrades
- Upgrade
sea-queryto 0.26 https://github.com/SeaQL/sea-orm/pull/985
Full Changelog: https://github.com/SeaQL/sea-orm/compare/0.9.0...0.10.0
0.9.3 - 2022-09-30
Enhancements
fn column()also handle enum type https://github.com/SeaQL/sea-orm/pull/973- Generate migration in modules https://github.com/SeaQL/sea-orm/pull/933
- Generate
DeriveRelationon emptyRelationenum https://github.com/SeaQL/sea-orm/pull/1019 - Documentation grammar fixes https://github.com/SeaQL/sea-orm/pull/1050
Bug Fixes
- Implement
IntoActiveValuefortimetypes https://github.com/SeaQL/sea-orm/pull/1041 - Fixed module import for
FromJsonQueryResultderive macro https://github.com/SeaQL/sea-orm/pull/1081
0.9.2 - 2022-08-20
Enhancements
- [sea-orm-cli] Migrator CLI handles init and generate commands https://github.com/SeaQL/sea-orm/pull/931
- [sea-orm-cli] added
with-copy-enumsflag to conditional deriveCopyonActiveEnumhttps://github.com/SeaQL/sea-orm/pull/936
House Keeping
- Exclude
chronodefault features https://github.com/SeaQL/sea-orm/pull/950 - Set minimal rustc version to
1.60https://github.com/SeaQL/sea-orm/pull/938 - Update
sea-queryto0.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
VarBinarycolumn type https://github.com/SeaQL/sea-orm/pull/746 - [sea-orm-cli] Generate entity for SYSTEM VERSIONED tables on MariaDB https://github.com/SeaQL/sea-orm/pull/876
Bug Fixes
RelationDef&RelationBuildershould beSend&Synchttps://github.com/SeaQL/sea-orm/pull/898
House Keeping
- Remove unnecessary
async_traithttps://github.com/SeaQL/sea-orm/pull/737
0.9.0 - 2022-07-17
New Features
- Cursor pagination https://github.com/SeaQL/sea-orm/pull/822
- Custom join on conditions https://github.com/SeaQL/sea-orm/pull/793
DeriveMigrationNameandsea_orm_migration::util::get_file_stemhttps://github.com/SeaQL/sea-orm/pull/736FromJsonQueryResultfor deserializingJsonfrom query result https://github.com/SeaQL/sea-orm/pull/794
Enhancements
- Added
sqlx_logging_leveltoConnectOptionshttps://github.com/SeaQL/sea-orm/pull/800 - Added
num_items_and_pagestoPaginatorhttps://github.com/SeaQL/sea-orm/pull/768 - Added
TryFromU64fortimehttps://github.com/SeaQL/sea-orm/pull/849 - Added
Insert::on_conflicthttps://github.com/SeaQL/sea-orm/pull/791 - Added
QuerySelect::join_asandQuerySelect::join_as_revhttps://github.com/SeaQL/sea-orm/pull/852 - Include column name in
TryGetError::Nullhttps://github.com/SeaQL/sea-orm/pull/853 - [sea-orm-cli] Improve logging https://github.com/SeaQL/sea-orm/pull/735
- [sea-orm-cli] Generate enum with numeric like variants https://github.com/SeaQL/sea-orm/pull/588
- [sea-orm-cli] Allow old pending migration to be applied https://github.com/SeaQL/sea-orm/pull/755
- [sea-orm-cli] Skip generating entity for ignored tables https://github.com/SeaQL/sea-orm/pull/837
- [sea-orm-cli] Generate code for
timecrate https://github.com/SeaQL/sea-orm/pull/724 - [sea-orm-cli] Add various blob column types https://github.com/SeaQL/sea-orm/pull/850
- [sea-orm-cli] Generate entity files with Postgres's schema name https://github.com/SeaQL/sea-orm/pull/422
Upgrades
- Upgrade
clapto 3.2 https://github.com/SeaQL/sea-orm/pull/706 - Upgrade
timeto 0.3 https://github.com/SeaQL/sea-orm/pull/834 - Upgrade
sqlxto 0.6 https://github.com/SeaQL/sea-orm/pull/834 - Upgrade
uuidto 1.0 https://github.com/SeaQL/sea-orm/pull/834 - Upgrade
sea-queryto 0.26 https://github.com/SeaQL/sea-orm/pull/834 - Upgrade
sea-schemato 0.9 https://github.com/SeaQL/sea-orm/pull/834
House Keeping
- Refactor stream metrics https://github.com/SeaQL/sea-orm/pull/778
Bug Fixes
- [sea-orm-cli] skip checking connection string for credentials https://github.com/SeaQL/sea-orm/pull/851
Breaking Changes
SelectTwoMany::one()has been dropped https://github.com/SeaQL/sea-orm/pull/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-timewill enablesqlx?/timeonly ifsqlxis already enabled. As a consequence, now the featureswith-json,with-chrono,with-rust_decimal,with-uuid,with-timewill not be enabled as a side-effect of enablingsqlx.
Full Changelog: https://github.com/SeaQL/sea-orm/compare/0.8.0...0.9.0
sea-orm-migration 0.8.3
- Removed
async-stdfrom dependency https://github.com/SeaQL/sea-orm/pull/758
0.8.0 - 2022-05-10
New Features
- [sea-orm-cli]
sea migrate generateto generate a new, empty migration file https://github.com/SeaQL/sea-orm/pull/656
Enhancements
- Add
max_connectionsoption to CLI https://github.com/SeaQL/sea-orm/pull/670 - Derive
Eq,CloneforDbErrhttps://github.com/SeaQL/sea-orm/pull/677 - Add
is_changedtoActiveModelTraithttps://github.com/SeaQL/sea-orm/pull/683
Bug Fixes
- Fix
DerivePrimaryKeywith custom primary key column name https://github.com/SeaQL/sea-orm/pull/694 - Fix
DeriveEntityModelmacros override column name https://github.com/SeaQL/sea-orm/pull/695 - Fix Insert with no value supplied using
DEFAULThttps://github.com/SeaQL/sea-orm/pull/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::preludeshould be replaced bysea_orm_migration::preludein all migration files
Upgrades
- Upgrade
sea-queryto 0.24.x,sea-schemato 0.8.x - Upgrade example to Actix Web 4, Actix Web 3 remains https://github.com/SeaQL/sea-orm/pull/638
- Added Tonic gRPC example https://github.com/SeaQL/sea-orm/pull/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 https://github.com/SeaQL/sea-orm/issues/420
- Reduce database connections to 1 during codegen https://github.com/SeaQL/sea-orm/issues/511
- Column names with single letters separated by underscores are concatenated https://github.com/SeaQL/sea-orm/issues/630
- Update Actix Web examples https://github.com/SeaQL/sea-orm/issues/639
- Lower function missing https://github.com/SeaQL/sea-orm/issues/672
- is_changed on active_model https://github.com/SeaQL/sea-orm/issues/674
- Failing find_with_related with column_name attribute https://github.com/SeaQL/sea-orm/issues/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 https://github.com/SeaQL/sea-orm/pull/492
- Supports
timecrate by @billy1624 https://github.com/SeaQL/sea-orm/pull/602 - Allow for creation of indexes for PostgreSQL and SQLite @nickb937 https://github.com/SeaQL/sea-orm/pull/593
- Added
delete_by_id@ShouvikGhosh2048 https://github.com/SeaQL/sea-orm/pull/590 - Implement
PaginatorTraitforSelectorRaw@shinbunbun https://github.com/SeaQL/sea-orm/pull/617
Enhancements
- Added axum graphql example by @aaronleopold in https://github.com/SeaQL/sea-orm/pull/587
- Add example for integrate with jsonrpsee by @hunjixin https://github.com/SeaQL/sea-orm/pull/632
- Codegen add serde derives to enums, if specified by @BenJeau https://github.com/SeaQL/sea-orm/pull/463
- Codegen Unsigned Integer by @billy1624 https://github.com/SeaQL/sea-orm/pull/397
- Add
Sendbound toQueryStreamandTransactionStreamby @sebpuetz https://github.com/SeaQL/sea-orm/pull/471 - Add
SendtoStreamTraitby @nappa85 https://github.com/SeaQL/sea-orm/pull/622 seaas an alternative bin name tosea-orm-cliby @ZhangHanDong https://github.com/SeaQL/sea-orm/pull/558
Bug Fixes
- Fix codegen with Enum in expanded format by @billy1624 https://github.com/SeaQL/sea-orm/pull/624
- Fixing and testing into_json of various field types by @billy1624 https://github.com/SeaQL/sea-orm/pull/539
Breaking Changes
- Exclude
mockfrom default features by @billy1624 https://github.com/SeaQL/sea-orm/pull/562 create_table_from_entitywill no longer create index for MySQL, please use the new methodcreate_index_from_entity
Documentations
- Describe default value of ActiveValue on document by @Ken-Miura in https://github.com/SeaQL/sea-orm/pull/556
- community: add axum-book-management by @lz1998 in https://github.com/SeaQL/sea-orm/pull/564
- Add Backpack to project showcase by @JSH32 in https://github.com/SeaQL/sea-orm/pull/567
- Add mediarepo to showcase by @Trivernis in https://github.com/SeaQL/sea-orm/pull/569
- COMMUNITY: add a link to Svix to showcase by @tasn in https://github.com/SeaQL/sea-orm/pull/537
- Update COMMUNITY.md by @naryand in https://github.com/SeaQL/sea-orm/pull/570
- Update COMMUNITY.md by @BobAnkh in https://github.com/SeaQL/sea-orm/pull/568
- Update COMMUNITY.md by @KaniyaSimeji in https://github.com/SeaQL/sea-orm/pull/566
- Update COMMUNITY.md by @aaronleopold in https://github.com/SeaQL/sea-orm/pull/565
- Update COMMUNITY.md by @gudaoxuri in https://github.com/SeaQL/sea-orm/pull/572
- Update Wikijump's entry in COMMUNITY.md by @ammongit in https://github.com/SeaQL/sea-orm/pull/573
- Update COMMUNITY.md by @koopa1338 in https://github.com/SeaQL/sea-orm/pull/574
- Update COMMUNITY.md by @gengteng in https://github.com/SeaQL/sea-orm/pull/580
- Update COMMUNITY.md by @Yama-Tomo in https://github.com/SeaQL/sea-orm/pull/582
- add oura-postgres-sink to COMMUNITY.md by @rvcas in https://github.com/SeaQL/sea-orm/pull/594
- Add rust-example-caster-api to COMMUNITY.md by @bkonkle in https://github.com/SeaQL/sea-orm/pull/623
Fixed Issues
- orm-cli generated incorrect type for #[sea_orm(primary_key)]. Should be u64. Was i64. https://github.com/SeaQL/sea-orm/issues/295
- how to update dynamically from json value https://github.com/SeaQL/sea-orm/issues/346
- Make
DatabaseConnectionClonewith the default features enabled https://github.com/SeaQL/sea-orm/issues/438 - Updating multiple fields in a Model by passing a reference https://github.com/SeaQL/sea-orm/issues/460
- SeaORM CLI not adding serde derives to Enums https://github.com/SeaQL/sea-orm/issues/461
- sea-orm-cli generates wrong data type for nullable blob https://github.com/SeaQL/sea-orm/issues/490
- Support the time crate in addition (instead of?) chrono https://github.com/SeaQL/sea-orm/issues/499
- PaginatorTrait for SelectorRaw https://github.com/SeaQL/sea-orm/issues/500
- sea_orm::DatabaseConnection should implement
Cloneby default https://github.com/SeaQL/sea-orm/issues/517 - How do you seed data in migrations using ActiveModels? https://github.com/SeaQL/sea-orm/issues/522
- Datetime fields are not serialized by
.into_json()on queries https://github.com/SeaQL/sea-orm/issues/530 - Update / Delete by id https://github.com/SeaQL/sea-orm/issues/552
#[sea_orm(indexed)]only works for MySQL https://github.com/SeaQL/sea-orm/issues/554sea-orm-cli generate --with-serdedoes not work on Postgresql custom type https://github.com/SeaQL/sea-orm/issues/581sea-orm-cli generate --expanded-formatpanic when postgres table contains enum type https://github.com/SeaQL/sea-orm/issues/614- UUID fields are not serialized by
.into_json()on queries https://github.com/SeaQL/sea-orm/issues/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 https://github.com/SeaQL/sea-orm/pull/335
- Support
DateTime<Utc>&DateTime<Local>by @billy1624 in https://github.com/SeaQL/sea-orm/pull/489 - Add
max_lifetimeconnection option by @billy1624 in https://github.com/SeaQL/sea-orm/pull/493
Enhancements
- Model with Generics by @billy1624 in https://github.com/SeaQL/sea-orm/pull/400
- Add Poem example by @sunli829 in https://github.com/SeaQL/sea-orm/pull/446
- Codegen
column_nameproc_macro attribute by @billy1624 in https://github.com/SeaQL/sea-orm/pull/433 - Easy joins with MockDatabase #447 by @cemoktra in https://github.com/SeaQL/sea-orm/pull/455
Bug Fixes
- CLI allow generate entity with url without password by @billy1624 in https://github.com/SeaQL/sea-orm/pull/436
- Support up to 6-ary composite primary key by @billy1624 in https://github.com/SeaQL/sea-orm/pull/423
- Fix FromQueryResult when Result is redefined by @tasn in https://github.com/SeaQL/sea-orm/pull/495
- Remove
r#prefix when derivingFromQueryResultby @smrtrfszm in https://github.com/SeaQL/sea-orm/pull/494
Breaking Changes
- Name conflict of foreign key constraints when two entities have more than one foreign keys by @billy1624 in https://github.com/SeaQL/sea-orm/pull/417
Fixed Issues
- Is it possible to have 4 values Composite Key? https://github.com/SeaQL/sea-orm/issues/352
- Support
DateTime<Utc>&DateTime<Local>https://github.com/SeaQL/sea-orm/issues/381 - Codegen
column_nameproc_macro attribute if column name isn't in snake case https://github.com/SeaQL/sea-orm/issues/395 - Model with Generics https://github.com/SeaQL/sea-orm/issues/402
- Foreign key constraint collision when multiple keys exist between the same two tables https://github.com/SeaQL/sea-orm/issues/405
- sea-orm-cli passwordless database user causes "No password was found in the database url" error https://github.com/SeaQL/sea-orm/issues/435
- Testing joins with MockDatabase https://github.com/SeaQL/sea-orm/issues/447
- Surface max_lifetime connection option https://github.com/SeaQL/sea-orm/issues/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? https://github.com/SeaQL/sea-orm/issues/289
- Rework
ActiveValuehttps://github.com/SeaQL/sea-orm/issues/321 - Some missing ActiveEnum utilities https://github.com/SeaQL/sea-orm/issues/338
Merged PRs
- First metric and tracing implementation by @nappa85 in https://github.com/SeaQL/sea-orm/pull/373
- Update sea-orm to depends on SeaQL/sea-query#202 by @billy1624 in https://github.com/SeaQL/sea-orm/pull/370
- Codegen ActiveEnum & Create Enum From ActiveEnum by @billy1624 in https://github.com/SeaQL/sea-orm/pull/348
- Axum example: update to Axum v0.4.2 by @ttys3 in https://github.com/SeaQL/sea-orm/pull/383
- Fix rocket version by @Gabriel-Paulucci in https://github.com/SeaQL/sea-orm/pull/384
- Insert & Update Return
Modelby @billy1624 in https://github.com/SeaQL/sea-orm/pull/339 - Rework
ActiveValueby @billy1624 in https://github.com/SeaQL/sea-orm/pull/340 - Add wrapper method
ModelTrait::deleteby @billy1624 in https://github.com/SeaQL/sea-orm/pull/396 - Add docker create script for contributors to setup databases locally by @billy1624 in https://github.com/SeaQL/sea-orm/pull/378
- Log with tracing-subscriber by @billy1624 in https://github.com/SeaQL/sea-orm/pull/399
- Codegen SQLite by @billy1624 in https://github.com/SeaQL/sea-orm/pull/386
- PR without clippy warnings in file changed tab by @billy1624 in https://github.com/SeaQL/sea-orm/pull/401
- Rename
sea-strumlib back tostrumby @billy1624 in https://github.com/SeaQL/sea-orm/pull/361
Breaking Changes
ActiveModel::insertandActiveModel::updatereturnModelinstead ofActiveModel- Method
ActiveModelBehavior::after_savetakesModelas input instead ofActiveModel - Rename method
sea_orm::unchanged_active_value_not_intended_for_public_usetosea_orm::Unchanged - Rename method
ActiveValue::unsettoActiveValue::not_set - Rename method
ActiveValue::is_unsettoActiveValue::is_not_set PartialEqofActiveValuewill 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 https://github.com/SeaQL/sea-orm/issues/362
- find_with_related panic https://github.com/SeaQL/sea-orm/issues/374
- How to define the rust type of TIMESTAMP? https://github.com/SeaQL/sea-orm/issues/344
- Add Table on the generated Column enum https://github.com/SeaQL/sea-orm/issues/356
Merged PRs
Delete::many()withTableRefby @billy1624 in https://github.com/SeaQL/sea-orm/pull/363- Fix related & linked with enum columns by @billy1624 in https://github.com/SeaQL/sea-orm/pull/376
- Temporary Fix: Handling MySQL & SQLite timestamp columns by @billy1624 in https://github.com/SeaQL/sea-orm/pull/379
- Add feature to generate table Iden by @Sytten in https://github.com/SeaQL/sea-orm/pull/360
0.4.1 - 2021-12-05
Fixed Issues
- Is it possible to have 4 values Composite Key? https://github.com/SeaQL/sea-orm/issues/352
- [sea-orm-cli] Better handling of relation generations https://github.com/SeaQL/sea-orm/issues/239
Merged PRs
- Add TryFromU64 trait for
DateTime<FixedOffset>. by @kev0960 in https://github.com/SeaQL/sea-orm/pull/331 - add offset and limit by @lz1998 in https://github.com/SeaQL/sea-orm/pull/351
- For some reason the
axum_examplefail to compile by @billy1624 in https://github.com/SeaQL/sea-orm/pull/355 - Support Up to 6 Values Composite Primary Key by @billy1624 in https://github.com/SeaQL/sea-orm/pull/353
- Codegen Handle Self Referencing & Multiple Relations to the Same Related Entity by @billy1624 in https://github.com/SeaQL/sea-orm/pull/347
0.4.0 - 2021-11-19
Fixed Issues
- Disable SQLx query logging https://github.com/SeaQL/sea-orm/issues/290
- Code generated by
sea-orm-clicannot pass clippy https://github.com/SeaQL/sea-orm/issues/296 - Should return detailed error message for connection failure https://github.com/SeaQL/sea-orm/issues/310
DateTimeWithTimeZonedoes not implementSerializeandDeserializehttps://github.com/SeaQL/sea-orm/issues/319- Support returning clause to avoid database hits https://github.com/SeaQL/sea-orm/issues/183
Merged PRs
- chore: update to Rust 2021 Edition by @sno2 in https://github.com/SeaQL/sea-orm/pull/273
- Enumeration - 3 by @billy1624 in https://github.com/SeaQL/sea-orm/pull/274
- Enumeration - 2 by @billy1624 in https://github.com/SeaQL/sea-orm/pull/261
- Codegen fix clippy warnings by @billy1624 in https://github.com/SeaQL/sea-orm/pull/303
- Add axum example by @YoshieraHuang in https://github.com/SeaQL/sea-orm/pull/297
- Enumeration by @billy1624 in https://github.com/SeaQL/sea-orm/pull/258
- Add
PaginatorTraitandCountTraitfor more constraints by @YoshieraHuang in https://github.com/SeaQL/sea-orm/pull/306 - Continue
PaginatorTraitby @billy1624 in https://github.com/SeaQL/sea-orm/pull/307 - Refactor
Schemaby @billy1624 in https://github.com/SeaQL/sea-orm/pull/309 - Detailed connection errors by @billy1624 in https://github.com/SeaQL/sea-orm/pull/312
- Suppress
ouroborosmissing docs warnings by @billy1624 in https://github.com/SeaQL/sea-orm/pull/288 with-jsonfeature requireschrono/serdeby @billy1624 in https://github.com/SeaQL/sea-orm/pull/320- Pass the argument
entity.table_ref()instead of justentity. by @josh-codes in https://github.com/SeaQL/sea-orm/pull/318 - Unknown types could be a newtypes instead of
ActiveEnumby @billy1624 in https://github.com/SeaQL/sea-orm/pull/324 - Returning by @billy1624 in https://github.com/SeaQL/sea-orm/pull/292
Breaking Changes
- Refactor
paginate()&count()utilities intoPaginatorTrait. You can use the paginator as usual but you might need to importPaginatorTraitmanually 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
SchemaconvertingEntityTraitinto differentsea-querystatements now has to be initialized withDbBackend.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
ActiveModelagainst PostgreSQL,RETURNINGclause 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 https://github.com/SeaQL/sea-orm/issues/286
Merged PRs
- Documentation for sea-orm by @charleschege in https://github.com/SeaQL/sea-orm/pull/280
- Support
Vec<u8>primary key by @billy1624 in https://github.com/SeaQL/sea-orm/pull/287
0.3.1 - 2021-10-23
(We are changing our Changelog format from now on)
Fixed Issues
- Align case transforms across derive macros https://github.com/SeaQL/sea-orm/issues/262
- Added
is_nullandis_not_nulltoColumnTraithttps://github.com/SeaQL/sea-orm/issues/267
(The following is generated by GitHub)
Merged PRs
- Changed manual url parsing to use Url crate by @AngelOnFira in https://github.com/SeaQL/sea-orm/pull/253
- Test self referencing relation by @billy1624 in https://github.com/SeaQL/sea-orm/pull/256
- Unify case-transform using the same crate by @billy1624 in https://github.com/SeaQL/sea-orm/pull/264
- CI cleaning by @AngelOnFira in https://github.com/SeaQL/sea-orm/pull/263
- CI install sea-orm-cli in debug mode by @billy1624 in https://github.com/SeaQL/sea-orm/pull/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()withoutunwrap() - [#205] Drop
Defaulttrait bound ofPrimaryKeyTrait::ValueType - [#222] Transaction & streaming
- [#210] Update
ActiveModelBehaviorAPI - [#240] Add derive
DeriveIntoActiveModelandIntoActiveValuetrait - [#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
--tablesoption - [#189] Add
debug_queryanddebug_query_stmtmacro
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_linkedjoin with alias - [#202] Accept both
postgres://andpostgresql:// - [#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
TryGetableManyfor different types of generics - Codegen
TimestampWithTimeZonefixup
0.2.2 - 2021-09-18
- [#105] Compact entity format
- [#132] Add ActiveModel
insert&update - [#129] Add
setmethod toUpdateMany - [#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]
logcrate andenv-logger - [#103]
InsertResultto 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
DateTimeWithTimeZoneas 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