@@ -17,14 +17,18 @@ pub fn generate_enum(
1717 for imp in imports_for_derives ( extra_derives) {
1818 imports. insert ( imp) ;
1919 }
20- let enum_name = format_ident ! ( "{}" , enum_info. name. to_upper_camel_case( ) ) ;
2120
21+ let enum_name = format_ident ! ( "{}" , enum_info. name. to_upper_camel_case( ) ) ;
2222 let doc = format ! ( "Enum: {}.{}" , enum_info. schema_name, enum_info. name) ;
2323
24+ imports. insert ( "use serde::{Serialize, Deserialize};" . to_string ( ) ) ;
2425 let mut derive_tokens = vec ! [
2526 quote! { Debug } ,
2627 quote! { Clone } ,
2728 quote! { PartialEq } ,
29+ quote! { Eq } ,
30+ quote! { Serialize } ,
31+ quote! { Deserialize } ,
2832 quote! { sqlx:: Type } ,
2933 ] ;
3034 for d in extra_derives {
@@ -33,8 +37,13 @@ pub fn generate_enum(
3337 }
3438
3539 // For PG, add #[sqlx(type_name = "...")]
40+ // Schema-qualify the type name for non-public schemas so sqlx can find the type
3641 let type_attr = if db_kind == DatabaseKind :: Postgres {
37- let pg_name = & enum_info. name ;
42+ let pg_name = if enum_info. schema_name != "public" {
43+ format ! ( "{}.{}" , enum_info. schema_name, enum_info. name)
44+ } else {
45+ enum_info. name . clone ( )
46+ } ;
3847 quote ! { #[ sqlx( type_name = #pg_name) ] }
3948 } else {
4049 quote ! { }
@@ -90,7 +99,11 @@ mod tests {
9099 parse_and_format ( & tokens)
91100 }
92101
93- fn gen_with_derives ( info : & EnumInfo , db : DatabaseKind , derives : & [ String ] ) -> ( String , BTreeSet < String > ) {
102+ fn gen_with_derives (
103+ info : & EnumInfo ,
104+ db : DatabaseKind ,
105+ derives : & [ String ] ,
106+ ) -> ( String , BTreeSet < String > ) {
94107 let ( tokens, imports) = generate_enum ( info, db, derives) ;
95108 ( parse_and_format ( & tokens) , imports)
96109 }
@@ -128,6 +141,27 @@ mod tests {
128141 assert ! ( code. contains( "sqlx(type_name = \" user_status\" )" ) ) ;
129142 }
130143
144+ #[ test]
145+ fn test_postgres_non_public_schema_qualified_type_name ( ) {
146+ let e = EnumInfo {
147+ schema_name : "auth" . to_string ( ) ,
148+ name : "role" . to_string ( ) ,
149+ variants : vec ! [ "admin" . to_string( ) , "user" . to_string( ) ] ,
150+ } ;
151+ let ( tokens, _) = generate_enum ( & e, DatabaseKind :: Postgres , & [ ] ) ;
152+ let code = parse_and_format ( & tokens) ;
153+ assert ! ( code. contains( "sqlx(type_name = \" auth.role\" )" ) ) ;
154+ }
155+
156+ #[ test]
157+ fn test_postgres_public_schema_not_qualified ( ) {
158+ let e = make_enum ( "status" , vec ! [ "a" ] ) ;
159+ let code = gen ( & e, DatabaseKind :: Postgres ) ;
160+ assert ! ( code. contains( "sqlx(type_name = \" status\" )" ) ) ;
161+ // type_name should NOT be schema-qualified for public schema
162+ assert ! ( !code. contains( "type_name = \" public.status\" " ) ) ;
163+ }
164+
131165 #[ test]
132166 fn test_mysql_no_type_name ( ) {
133167 let e = make_enum ( "status" , vec ! [ "a" ] ) ;
@@ -207,10 +241,10 @@ mod tests {
207241 // --- imports ---
208242
209243 #[ test]
210- fn test_no_derives_empty_imports ( ) {
244+ fn test_no_extra_derives_has_serde_import ( ) {
211245 let e = make_enum ( "status" , vec ! [ "a" ] ) ;
212246 let ( _, imports) = gen_with_derives ( & e, DatabaseKind :: Postgres , & [ ] ) ;
213- assert ! ( imports. is_empty ( ) ) ;
247+ assert ! ( imports. iter ( ) . any ( |i| i . contains ( "serde" ) ) ) ;
214248 }
215249
216250 #[ test]
0 commit comments