@@ -91,6 +91,24 @@ def querystring(self) -> QueryString:
9191 return QueryString (f"ALTER COLUMN { self .column_name } DROP DEFAULT" )
9292
9393
94+ @dataclass
95+ class SetColumnType (AlterStatement ):
96+ __slots__ = ("old_column" , "new_column" )
97+
98+ old_column : Column
99+ new_column : Column
100+
101+ @property
102+ def querystring (self ) -> QueryString :
103+ if self .new_column ._meta ._table is None :
104+ self .new_column ._meta ._table = self .old_column ._meta .table
105+
106+ column_name = self .old_column ._meta .name
107+ return QueryString (
108+ f"ALTER COLUMN { column_name } TYPE { self .new_column .column_type } "
109+ )
110+
111+
94112@dataclass
95113class SetDefault (AlterColumnStatement ):
96114 __slots__ = ("column" , "value" )
@@ -107,7 +125,7 @@ def querystring(self) -> QueryString:
107125
108126
109127@dataclass
110- class Unique (AlterColumnStatement ):
128+ class SetUnique (AlterColumnStatement ):
111129 __slots__ = ("boolean" ,)
112130
113131 boolean : bool
@@ -129,7 +147,7 @@ def querystring(self) -> QueryString:
129147
130148
131149@dataclass
132- class Null (AlterColumnStatement ):
150+ class SetNull (AlterColumnStatement ):
133151 __slots__ = ("boolean" ,)
134152
135153 boolean : bool
@@ -255,13 +273,14 @@ class Alter(Query):
255273 "_drop_default" ,
256274 "_drop_table" ,
257275 "_drop" ,
258- "_null" ,
259276 "_rename_columns" ,
260277 "_rename_table" ,
278+ "_set_column_type" ,
261279 "_set_default" ,
262280 "_set_digits" ,
263281 "_set_length" ,
264- "_unique" ,
282+ "_set_null" ,
283+ "_set_unique" ,
265284 )
266285
267286 def __init__ (self , table : t .Type [Table ]):
@@ -272,13 +291,14 @@ def __init__(self, table: t.Type[Table]):
272291 self ._drop_default : t .List [DropDefault ] = []
273292 self ._drop_table : t .Optional [DropTable ] = None
274293 self ._drop : t .List [DropColumn ] = []
275- self ._null : t .List [Null ] = []
276294 self ._rename_columns : t .List [RenameColumn ] = []
277295 self ._rename_table : t .List [RenameTable ] = []
296+ self ._set_column_type : t .List [SetColumnType ] = []
278297 self ._set_default : t .List [SetDefault ] = []
279298 self ._set_digits : t .List [SetDigits ] = []
280299 self ._set_length : t .List [SetLength ] = []
281- self ._unique : t .List [Unique ] = []
300+ self ._set_null : t .List [SetNull ] = []
301+ self ._set_unique : t .List [SetUnique ] = []
282302
283303 def add_column (self , name : str , column : Column ) -> Alter :
284304 """
@@ -333,6 +353,15 @@ def rename_column(
333353 self ._rename_columns .append (RenameColumn (column , new_name ))
334354 return self
335355
356+ def set_column_type (self , old_column : Column , new_column : Column ) -> Alter :
357+ """
358+ Change the type of a column.
359+ """
360+ self ._set_column_type .append (
361+ SetColumnType (old_column = old_column , new_column = new_column )
362+ )
363+ return self
364+
336365 def set_default (self , column : Column , value : t .Any ) -> Alter :
337366 """
338367 Set the default for a column.
@@ -349,7 +378,7 @@ def set_null(
349378 Band.alter().set_null(Band.name, True)
350379 Band.alter().set_null('name', True)
351380 """
352- self ._null .append (Null (column , boolean ))
381+ self ._set_null .append (SetNull (column , boolean ))
353382 return self
354383
355384 def set_unique (
@@ -359,7 +388,7 @@ def set_unique(
359388 Band.alter().set_unique(Band.name, True)
360389 Band.alter().set_unique('name', True)
361390 """
362- self ._unique .append (Unique (column , boolean ))
391+ self ._set_unique .append (SetUnique (column , boolean ))
363392 return self
364393
365394 def set_length (self , column : t .Union [str , Varchar ], length : int ) -> Alter :
@@ -472,8 +501,9 @@ def querystrings(self) -> t.Sequence[QueryString]:
472501 self ._rename_table ,
473502 self ._drop ,
474503 self ._drop_default ,
475- self ._unique ,
476- self ._null ,
504+ self ._set_column_type ,
505+ self ._set_unique ,
506+ self ._set_null ,
477507 self ._set_length ,
478508 self ._set_default ,
479509 self ._set_digits ,
0 commit comments