Add default_expr support for ColumnDef (#1474)

* Add default_expr support for ColumnDef

* added test for attribute `default_value`

* Implements `PartialEq` for `sea_query::SimpleExpr`

* RcOrArc

* Re-export `sea_query::Expr` in `sea_orm::entity::prelude`

* Add default_expr support for ColumnDef

* added test for attribute `default_value`

* Implements `PartialEq` for `sea_query::SimpleExpr`

* RcOrArc

* Re-export `sea_query::Expr` in `sea_orm::entity::prelude`

* Deprecate `ColumnDef::default_value()`

* Add `ColumnDef::default()`

---------

Co-authored-by: Billy Chan <ccw.billy.123@gmail.com>
This commit is contained in:
Diwakar Gupta 2023-07-13 19:39:53 +05:30 committed by GitHub
parent 4953e37a34
commit 1ba37b61d5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 48 additions and 10 deletions

View File

@ -137,7 +137,15 @@ pub fn expand_derive_entity_model(data: Data, attrs: Vec<Attribute>) -> syn::Res
} else if meta.path.is_ident("default_value") { } else if meta.path.is_ident("default_value") {
default_value = Some(meta.value()?.parse::<Lit>()?); default_value = Some(meta.value()?.parse::<Lit>()?);
} else if meta.path.is_ident("default_expr") { } else if meta.path.is_ident("default_expr") {
default_expr = Some(meta.value()?.parse::<Lit>()?); let lit = meta.value()?.parse()?;
if let Lit::Str(litstr) = lit {
let value_expr: TokenStream = syn::parse_str(&litstr.value())?;
default_expr = Some(value_expr);
} else {
return Err(
meta.error(format!("Invalid column_type {:?}", lit))
);
}
} else if meta.path.is_ident("column_name") { } else if meta.path.is_ident("column_name") {
let lit = meta.value()?.parse()?; let lit = meta.value()?.parse()?;
if let Lit::Str(litstr) = lit { if let Lit::Str(litstr) = lit {
@ -264,10 +272,10 @@ pub fn expand_derive_entity_model(data: Data, attrs: Vec<Attribute>) -> syn::Res
match_row = quote! { #match_row.unique() }; match_row = quote! { #match_row.unique() };
} }
if let Some(default_value) = default_value { if let Some(default_value) = default_value {
match_row = quote! { #match_row.default_value(#default_value) }; match_row = quote! { #match_row.default(#default_value) };
} }
if let Some(default_expr) = default_expr { if let Some(default_expr) = default_expr {
match_row = quote! { #match_row.default_expr(#default_expr) }; match_row = quote! { #match_row.default(#default_expr) };
} }
columns_trait.push(match_row); columns_trait.push(match_row);
} }

View File

@ -15,7 +15,7 @@ pub struct ColumnDef {
pub(crate) null: bool, pub(crate) null: bool,
pub(crate) unique: bool, pub(crate) unique: bool,
pub(crate) indexed: bool, pub(crate) indexed: bool,
pub(crate) default_value: Option<Value>, pub(crate) default: Option<SimpleExpr>,
} }
macro_rules! bind_oper { macro_rules! bind_oper {
@ -310,7 +310,7 @@ impl ColumnTypeTrait for ColumnType {
null: false, null: false,
unique: false, unique: false,
indexed: false, indexed: false,
default_value: None, default: None,
} }
} }
@ -362,11 +362,21 @@ impl ColumnDef {
} }
/// Set the default value /// Set the default value
#[deprecated(since = "0.12.0", note = "Please use [`ColumnDef::default`]")]
pub fn default_value<T>(mut self, value: T) -> Self pub fn default_value<T>(mut self, value: T) -> Self
where where
T: Into<Value>, T: Into<Value>,
{ {
self.default_value = Some(value.into()); self.default = Some(value.into().into());
self
}
/// Set the default value or expression of a column
pub fn default<T>(mut self, default: T) -> Self
where
T: Into<SimpleExpr>,
{
self.default = Some(default.into());
self self
} }
@ -493,7 +503,7 @@ mod tests {
#[test] #[test]
#[cfg(feature = "macros")] #[cfg(feature = "macros")]
fn entity_model_column_1() { fn entity_model_column_1() {
use crate::entity::*; use crate::prelude::*;
mod hello { mod hello {
use crate as sea_orm; use crate as sea_orm;
@ -521,6 +531,12 @@ mod tests {
pub eight: u32, pub eight: u32,
#[sea_orm(unique, indexed, nullable)] #[sea_orm(unique, indexed, nullable)]
pub nine: u64, pub nine: u64,
#[sea_orm(default_expr = "Expr::current_timestamp()")]
pub ten: DateTimeUtc,
#[sea_orm(default_value = 7)]
pub eleven: u8,
#[sea_orm(default_value = "twelve_value")]
pub twelve: String,
} }
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
@ -562,6 +578,20 @@ mod tests {
hello::Column::Nine.def(), hello::Column::Nine.def(),
ColumnType::BigUnsigned.def().unique().indexed().nullable() ColumnType::BigUnsigned.def().unique().indexed().nullable()
); );
assert_eq!(
hello::Column::Ten.def(),
ColumnType::TimestampWithTimeZone
.def()
.default(Expr::current_timestamp())
);
assert_eq!(
hello::Column::Eleven.def(),
ColumnType::TinyUnsigned.def().default(7)
);
assert_eq!(
hello::Column::Twelve.def(),
ColumnType::String(None).def().default("twelve_value")
);
} }
#[test] #[test]

View File

@ -1,6 +1,6 @@
pub use crate::{ pub use crate::{
error::*, error::*,
sea_query::{BlobSize, DynIden, RcOrArc, SeaRc}, sea_query::{BlobSize, DynIden, Expr, RcOrArc, SeaRc},
ActiveEnum, ActiveModelBehavior, ActiveModelTrait, ColumnDef, ColumnTrait, ColumnType, ActiveEnum, ActiveModelBehavior, ActiveModelTrait, ColumnDef, ColumnTrait, ColumnType,
ColumnTypeTrait, ConnectionTrait, CursorTrait, DatabaseConnection, DbConn, EntityName, ColumnTypeTrait, ConnectionTrait, CursorTrait, DatabaseConnection, DbConn, EntityName,
EntityTrait, EnumIter, ForeignKeyAction, Iden, IdenStatic, Linked, LoaderTrait, ModelTrait, EntityTrait, EnumIter, ForeignKeyAction, Iden, IdenStatic, Linked, LoaderTrait, ModelTrait,

View File

@ -210,8 +210,8 @@ where
if orm_column_def.unique { if orm_column_def.unique {
column_def.unique_key(); column_def.unique_key();
} }
if let Some(value) = orm_column_def.default_value { if let Some(default) = orm_column_def.default {
column_def.default(value); column_def.default(default);
} }
for primary_key in E::PrimaryKey::iter() { for primary_key in E::PrimaryKey::iter() {
if column.to_string() == primary_key.into_column().to_string() { if column.to_string() == primary_key.into_column().to_string() {