From cd990bd72af3b0eecbacd657f6fbf1e452c19d52 Mon Sep 17 00:00:00 2001 From: lazulit3 <128615656+lazulit3@users.noreply.github.com> Date: Wed, 21 May 2025 18:17:37 -0700 Subject: [PATCH 1/2] fix: include column_name in DeriveColumn FromStr This updates the `FromStr` implementation in `DeriveColumn` to ensure that `column_name` attributes are recognized. When custom `column_name`s did not match the snake_case or lowerCamelCase variants (that the derivation already provides), then a column Iden could fail to map to a column. --- sea-orm-macros/src/derives/column.rs | 38 ++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/sea-orm-macros/src/derives/column.rs b/sea-orm-macros/src/derives/column.rs index f91cf48eba..8a52de9411 100644 --- a/sea-orm-macros/src/derives/column.rs +++ b/sea-orm-macros/src/derives/column.rs @@ -70,14 +70,36 @@ pub fn impl_col_from_str(ident: &Ident, data: &Data) -> syn::Result } }; - let columns = data_enum.variants.iter().map(|column| { - let column_iden = column.ident.clone(); - let column_str_snake = column_iden.to_string().to_snake_case(); - let column_str_mixed = column_iden.to_string().to_lower_camel_case(); - quote!( - #column_str_snake | #column_str_mixed => Ok(#ident::#column_iden) - ) - }); + let columns = data_enum + .variants + .iter() + .map(|column| { + let column_iden = column.ident.clone(); + let column_str_snake = column_iden.to_string().to_snake_case(); + let column_str_mixed = column_iden.to_string().to_lower_camel_case(); + + let mut column_name = column_str_snake.clone(); + for attr in column.attrs.iter() { + if !attr.path().is_ident("sea_orm") { + continue; + } + attr.parse_nested_meta(|meta| { + if meta.path.is_ident("column_name") { + column_name = meta.value()?.parse::()?.value(); + } else { + // Reads the value expression to advance the parse stream. + // Some parameters, such as `primary_key`, do not have any value, + // so ignoring an error occurred here. + let _: Option = meta.value().and_then(|v| v.parse()).ok(); + } + Ok(()) + })?; + } + Ok::(quote!( + #column_str_snake | #column_str_mixed | #column_name => Ok(#ident::#column_iden) + )) + }) + .collect::, _>>()?; Ok(quote!( #[automatically_derived] From d9fd68d31b2d96e8d6b821ab02ede303c99fbb15 Mon Sep 17 00:00:00 2001 From: lazulit3 <128615656+lazulit3@users.noreply.github.com> Date: Wed, 21 May 2025 18:17:37 -0700 Subject: [PATCH 2/2] test: ensure Column::from_str recognizes column_name This adds a test case for `DeriveEntityModel` colum names to verify that `Column::from_str` succeeds on a particularly weird `column_name`. --- .../tests/derive_entity_model_column_name_test.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sea-orm-macros/tests/derive_entity_model_column_name_test.rs b/sea-orm-macros/tests/derive_entity_model_column_name_test.rs index 989a8bdca0..0ab9cb03ae 100644 --- a/sea-orm-macros/tests/derive_entity_model_column_name_test.rs +++ b/sea-orm-macros/tests/derive_entity_model_column_name_test.rs @@ -1,3 +1,5 @@ +use std::str::FromStr; + use sea_orm::prelude::*; use sea_orm::Iden; use sea_orm::Iterable; @@ -36,4 +38,8 @@ fn test_column_names() { "ordersCount", ] ); + + let col = + Column::from_str("lAsTnAmE").expect("column from str should recognize column_name attr"); + assert!(matches!(col, Column::LastName)) }