def add_column( self, table_class_name: str, tablename: str, column_name: str, column_class_name: str = "", column_class: t.Optional[t.Type[Column]] = None, params: t.Dict[str, t.Any] = {}, ): """ Add a new column to the table. :param column_class_name: The column type was traditionally specified as a string, using this variable. This didn't allow users to define custom column types though, which is why newer migrations directly reference a ``Column`` subclass using ``column_class``. :param column_class: A direct reference to a ``Column`` subclass. """ column_class = column_class or getattr(column_types, column_class_name) if column_class is None: raise ValueError("Unrecognised column type") cleaned_params = deserialise_params(params=params) column = column_class(**cleaned_params) column._meta.name = column_name self.add_columns.append( AddColumnClass( column=column, tablename=tablename, table_class_name=table_class_name, ))
def add_column( self, table_class_name: str, tablename: str, column_name: str, column_class_name: str, params: t.Dict[str, t.Any] = {}, ): column_class = getattr(column_types, column_class_name) cleaned_params = deserialise_params(params=params) column = column_class(**cleaned_params) column._meta.name = column_name self.add_columns.append( AddColumnClass( column=column, tablename=tablename, table_class_name=table_class_name, ))
def __sub__(self, value: DiffableTable) -> TableDelta: if not isinstance(value, DiffableTable): raise ValueError( "Can only diff with other DiffableTable instances" ) if value.class_name != self.class_name: raise ValueError( "The two tables don't appear to have the same name." ) add_columns = [ AddColumn( table_class_name=self.class_name, column_name=i._meta.name, column_class_name=i.__class__.__name__, params=i._meta.params, ) for i in (set(self.columns) - set(value.columns)) ] drop_columns = [ DropColumn( table_class_name=self.class_name, column_name=i._meta.name, tablename=value.tablename, ) for i in (set(value.columns) - set(self.columns)) ] alter_columns: t.List[AlterColumn] = [] for existing_column in value.columns: column = self.columns_map.get(existing_column._meta.name) if not column: # This is a new column - already captured above. continue delta = compare_dicts( serialise_params(column._meta.params).params, serialise_params(existing_column._meta.params).params, ) old_params = { key: existing_column._meta.params.get(key) for key, _ in delta.items() } if delta: alter_columns.append( AlterColumn( table_class_name=self.class_name, tablename=self.tablename, column_name=column._meta.name, params=deserialise_params(delta), old_params=old_params, ) ) return TableDelta( add_columns=add_columns, drop_columns=drop_columns, alter_columns=alter_columns, )