def METHOD_NAME(self) -> None:
    """Sync table columns with the database. Keep metadata for existing columns"""
    try:
        column_metadata = get_physical_table_metadata(
            self.database, self.name, self.schema
        )
    except Exception:  # pylint: disable=broad-except
        column_metadata = []
    existing_columns = {column.name: column for column in self.columns}
    quote_identifier = self.database.quote_identifier
    def update_or_create_column(column_meta: ResultSetColumnType) -> Column:
        column_name: str = column_meta["column_name"]
        if column_name in existing_columns:
            column = existing_columns[column_name]
        else:
            column = Column(name=column_name)
        column.type = column_meta["type"]
        column.is_temporal = column_meta["is_dttm"]
        column.expression = quote_identifier(column_name)
        column.is_aggregation = False
        column.is_physical = True
        column.is_spatial = False
        column.is_partition = False  # TODO: update with accurate is_partition
        return column
    self.columns = [update_or_create_column(col) for col in column_metadata]