diff options
| author | Chris Withers <chris@simplistix.co.uk> | 2011-02-11 10:27:39 +0000 |
|---|---|---|
| committer | Chris Withers <chris@simplistix.co.uk> | 2011-02-11 10:27:39 +0000 |
| commit | 0645c2fc9a052d8ef52b4120c7383aa6c6cf5b6f (patch) | |
| tree | 3eb8ecc65abe6ca964cca6ee549fcd1ec0937e30 /migrate/changeset | |
| parent | cda65c38b53ec0a0ffca0bcd30c675386e24c450 (diff) | |
| download | sqlalchemy-migrate-0645c2fc9a052d8ef52b4120c7383aa6c6cf5b6f.tar.gz | |
Bring back alter_metadata on ColumnDelta: it seems intertwined with a lot of the tests.
So, it's a private API now...
Diffstat (limited to 'migrate/changeset')
| -rw-r--r-- | migrate/changeset/schema.py | 52 |
1 files changed, 38 insertions, 14 deletions
diff --git a/migrate/changeset/schema.py b/migrate/changeset/schema.py index 8c4f458..75cd3fd 100644 --- a/migrate/changeset/schema.py +++ b/migrate/changeset/schema.py @@ -124,6 +124,12 @@ def alter_column(*p, **k): MigrateDeprecationWarning ) engine = k['engine'] + + # enough tests seem to break when metadata is always altered + # that this crutch has to be left in until they can be sorted + # out + k['alter_metadata']=True + delta = ColumnDelta(*p, **k) visitorcallable = get_engine_visitor(engine, 'schemachanger') @@ -201,6 +207,11 @@ class ColumnDelta(DictMixin, sqlalchemy.schema.SchemaItem): __visit_name__ = 'column' def __init__(self, *p, **kw): + # 'alter_metadata' is not a public api. It exists purely + # as a crutch until the tests that fail when 'alter_metadata' + # behaviour always happens can be sorted out + self.alter_metadata = kw.pop("alter_metadata", False) + self.meta = kw.pop("metadata", None) self.engine = kw.pop("engine", None) @@ -224,8 +235,11 @@ class ColumnDelta(DictMixin, sqlalchemy.schema.SchemaItem): self.apply_diffs(diffs) def __repr__(self): - return '<ColumnDelta %s>' % super(ColumnDelta, self).__repr__() - + return '<ColumnDelta altermetadata=%r, %s>' % ( + self.alter_metadata, + super(ColumnDelta, self).__repr__() + ) + def __getitem__(self, key): if key not in self.keys(): raise KeyError("No such diff key, available: %s" % self.diffs ) @@ -300,7 +314,7 @@ class ColumnDelta(DictMixin, sqlalchemy.schema.SchemaItem): self.result_column.type = self.result_column.type() # add column to the table - if self.table is not None: + if self.table is not None and self.alter_metadata: self.result_column.add_to_table(self.table) def are_column_types_eq(self, old_type, new_type): @@ -362,27 +376,37 @@ class ColumnDelta(DictMixin, sqlalchemy.schema.SchemaItem): def _set_table(self, table): if isinstance(table, basestring): - if not self.engine and not self.meta: - raise ValueError("engine or metadata must be specified" - " to reflect tables") - if not self.meta: - self.meta = sqlalchemy.MetaData() - meta = self.meta - if self.engine: - meta.bind = self.engine + if self.alter_metadata: + if not self.meta: + raise ValueError("metadata must be specified for table" + " reflection when using alter_metadata") + meta = self.meta + if self.engine: + meta.bind = self.engine + else: + if not self.engine and not self.meta: + raise ValueError("engine or metadata must be specified" + " to reflect tables") + if not self.engine: + self.engine = self.meta.bind + meta = sqlalchemy.MetaData(bind=self.engine) self._table = sqlalchemy.Table(table, meta, autoload=True) elif isinstance(table, sqlalchemy.Table): self._table = table - + if not self.alter_metadata: + self._table.meta = sqlalchemy.MetaData(bind=self._table.bind) def _get_result_column(self): return getattr(self, '_result_column', None) def _set_result_column(self, column): - """Set Column to Table.""" + """Set Column to Table based on alter_metadata evaluation.""" self.process_column(column) if not hasattr(self, 'current_name'): self.current_name = column.name - self._result_column = column + if self.alter_metadata: + self._result_column = column + else: + self._result_column = column.copy_fixed() table = property(_get_table, _set_table) result_column = property(_get_result_column, _set_result_column) |
