summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--migrate/changeset/schema.py10
-rw-r--r--migrate/exceptions.py4
-rw-r--r--migrate/tests/changeset/test_changeset.py13
-rw-r--r--migrate/tests/versioning/test_version.py4
-rw-r--r--migrate/versioning/util/__init__.py9
-rw-r--r--migrate/versioning/version.py17
6 files changed, 51 insertions, 6 deletions
diff --git a/migrate/changeset/schema.py b/migrate/changeset/schema.py
index a0e42cc..931ef7b 100644
--- a/migrate/changeset/schema.py
+++ b/migrate/changeset/schema.py
@@ -353,8 +353,14 @@ class ColumnDelta(six.with_metaclass(MyMeta, DictMixin, sqlalchemy.schema.Schema
self.process_column(self.result_column)
# create an instance of class type if not yet
- if 'type' in diffs and callable(self.result_column.type):
- self.result_column.type = self.result_column.type()
+ if 'type' in diffs:
+ if callable(self.result_column.type):
+ self.result_column.type = self.result_column.type()
+ if self.result_column.autoincrement and \
+ not issubclass(
+ self.result_column.type._type_affinity,
+ sqlalchemy.Integer):
+ self.result_column.autoincrement = False
# add column to the table
if self.table is not None and self.alter_metadata:
diff --git a/migrate/exceptions.py b/migrate/exceptions.py
index cb8c409..31c8cd9 100644
--- a/migrate/exceptions.py
+++ b/migrate/exceptions.py
@@ -27,6 +27,10 @@ class InvalidVersionError(ControlledSchemaError):
"""Invalid version number."""
+class VersionNotFoundError(KeyError):
+ """Specified version is not present."""
+
+
class DatabaseNotControlledError(ControlledSchemaError):
"""Database should be under version control, but it's not."""
diff --git a/migrate/tests/changeset/test_changeset.py b/migrate/tests/changeset/test_changeset.py
index 57d0380..93e9965 100644
--- a/migrate/tests/changeset/test_changeset.py
+++ b/migrate/tests/changeset/test_changeset.py
@@ -687,12 +687,25 @@ class TestColumnChange(fixture.DB):
self.assertTrue(isinstance(self.table.c.id.type, Integer))
self.assertEqual(self.table.c.id.nullable, False)
+ # SQLAlchemy 1.1 adds a third state to "autoincrement" called
+ # "auto".
+ self.assertTrue(self.table.c.id.autoincrement in ('auto', True))
+
if not self.engine.name == 'firebird':
self.table.c.id.alter(type=String(20))
self.assertEqual(self.table.c.id.nullable, False)
+
+ # a rule makes sure that autoincrement is set to False
+ # when we change off of Integer
+ self.assertEqual(self.table.c.id.autoincrement, False)
self.refresh_table(self.table.name)
self.assertTrue(isinstance(self.table.c.id.type, String))
+ # note that after reflection, "autoincrement" is likely
+ # to change back to a database-generated value. Should be
+ # False or "auto". if True, it's a bug; at least one of these
+ # exists prior to SQLAlchemy 1.1.3
+
@fixture.usedb()
def test_default(self):
"""Can change a column's server_default value (DefaultClauses only)
diff --git a/migrate/tests/versioning/test_version.py b/migrate/tests/versioning/test_version.py
index df50072..286dd59 100644
--- a/migrate/tests/versioning/test_version.py
+++ b/migrate/tests/versioning/test_version.py
@@ -103,6 +103,10 @@ class TestVersion(fixture.Pathed):
self.assertEqual(coll.latest, 4)
self.assertEqual(len(coll.versions), 4)
self.assertEqual(coll.version(4), coll.version(coll.latest))
+ # Check for non-existing version
+ self.assertRaises(VersionNotFoundError, coll.version, 5)
+ # Check for the current version
+ self.assertEqual('4', coll.version(4).version)
coll2 = Collection(self.temp_usable_dir)
self.assertEqual(coll.versions, coll2.versions)
diff --git a/migrate/versioning/util/__init__.py b/migrate/versioning/util/__init__.py
index 7ad226b..55c72c9 100644
--- a/migrate/versioning/util/__init__.py
+++ b/migrate/versioning/util/__init__.py
@@ -33,7 +33,14 @@ def load_model(dotted_name):
warnings.warn('model should be in form of module.model:User '
'and not module.model.User', exceptions.MigrateDeprecationWarning)
dotted_name = ':'.join(dotted_name.rsplit('.', 1))
- return EntryPoint.parse('x=%s' % dotted_name).load(False)
+
+ ep = EntryPoint.parse('x=%s' % dotted_name)
+ if hasattr(ep, 'resolve'):
+ # this is available on setuptools >= 10.2
+ return ep.resolve()
+ else:
+ # this causes a DeprecationWarning on setuptools >= 11.3
+ return ep.load(False)
else:
# Assume it's already loaded.
return dotted_name
diff --git a/migrate/versioning/version.py b/migrate/versioning/version.py
index 3ab814c..0633e1b 100644
--- a/migrate/versioning/version.py
+++ b/migrate/versioning/version.py
@@ -156,11 +156,22 @@ class Collection(pathed.Pathed):
self.versions[ver].add_script(filepath)
def version(self, vernum=None):
- """Returns latest Version if vernum is not given.
- Otherwise, returns wanted version"""
+ """Returns required version.
+
+ If vernum is not given latest version will be returned otherwise
+ required version will be returned.
+ :raises: : exceptions.VersionNotFoundError if respective migration
+ script file of version is not present in the migration repository.
+ """
if vernum is None:
vernum = self.latest
- return self.versions[VerNum(vernum)]
+
+ try:
+ return self.versions[VerNum(vernum)]
+ except KeyError:
+ raise exceptions.VersionNotFoundError(
+ ("Database schema file with version %(args)s doesn't "
+ "exist.") % {'args': VerNum(vernum)})
@classmethod
def clear(cls):