1010from omymodels .models .pydantic .types import types_mapping
1111from omymodels .types import big_integer_types , integer_types , string_types , text_types
1212
13+ # Types that support max_length constraint
14+ MAX_LENGTH_TYPES = string_types
15+
1316
1417class ModelGenerator :
1518 def __init__ (self ):
@@ -74,9 +77,18 @@ def get_not_custom_type(self, type_str: str) -> str:
7477 self .typing_imports .add ("List" )
7578 return _type
7679
80+ def _should_add_max_length (self , column : Column ) -> bool :
81+ """Check if column should have max_length constraint."""
82+ if not column .size :
83+ return False
84+ # Only add max_length for string types (varchar, char, etc.), not text
85+ original_type = column .type .lower ().split ("[" )[0 ]
86+ return original_type in MAX_LENGTH_TYPES
87+
7788 def generate_attr (self , column : Column , defaults_off : bool ) -> str :
7889 _type = None
7990 original_type = column .type # Keep original for array detection
91+ max_length = column .size if self ._should_add_max_length (column ) else None
8092
8193 if column .nullable :
8294 self .typing_imports .add ("Optional" )
@@ -99,13 +111,20 @@ def generate_attr(self, column: Column, defaults_off: bool) -> str:
99111 arg_name = column .name
100112 field_params = None
101113
102- # Check if we need Field() for alias or generated column
114+ # Check if we need Field() for alias, generated column, or max_length
103115 generated_as = getattr (column , "generated_as" , None )
104- if not self ._is_valid_identifier (column .name ) or generated_as is not None :
105- field_params = self ._get_field_params (column , defaults_off )
116+ needs_field = (
117+ not self ._is_valid_identifier (column .name )
118+ or generated_as is not None
119+ or max_length is not None
120+ )
121+
122+ if needs_field :
123+ field_params = self ._get_field_params (column , defaults_off , max_length )
106124 if field_params :
107125 self .imports .add ("Field" )
108- arg_name = self ._generate_valid_identifier (column .name )
126+ if not self ._is_valid_identifier (column .name ):
127+ arg_name = self ._generate_valid_identifier (column .name )
109128 else :
110129 if column .default is not None and not defaults_off :
111130 field_params = self ._get_default_value_string (column )
@@ -118,20 +137,28 @@ def generate_attr(self, column: Column, defaults_off: bool) -> str:
118137
119138 return column_str
120139
121- def _get_field_params (self , column : Column , defaults_off : bool ) -> str :
140+ def _get_field_params (
141+ self , column : Column , defaults_off : bool , max_length : int = None
142+ ) -> str :
122143 params = []
123144
124145 if not self ._is_valid_identifier (column .name ):
125146 params .append (f'alias="{ column .name } "' )
126147
127- if column .default is not None and not defaults_off :
148+ # For nullable fields with max_length, add default=None
149+ if column .nullable and max_length is not None and not defaults_off :
150+ params .append ("default=None" )
151+ elif column .default is not None and not defaults_off :
128152 if default_value := self ._get_default_value_string (column ):
129153 params .append (f"default{ default_value .replace (' ' , '' )} " )
130154
131155 generated_as = getattr (column , "generated_as" , None )
132156 if generated_as is not None :
133157 params .append ("exclude=True" )
134158
159+ if max_length is not None :
160+ params .append (f"max_length={ max_length } " )
161+
135162 if params :
136163 return f" = Field({ ', ' .join (params )} )"
137164 return ""
0 commit comments