diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-12-18 19:11:19 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-12-18 19:11:19 +0000 |
commit | fc175f478b4799ba69f457203103f48bdaa6a96d (patch) | |
tree | b7b631eda0ce0c3acda25a49ad24f755d7b76800 | |
parent | 7f7a908d20bbd91882de8e43d3e66d836e27958a (diff) | |
download | sqlalchemy-fc175f478b4799ba69f457203103f48bdaa6a96d.tar.gz |
- The version_id_col feature on mapper() will raise a warning when
used with dialects that don't support "rowcount" adequately.
[ticket:1569]
-rw-r--r-- | CHANGES | 4 | ||||
-rw-r--r-- | lib/sqlalchemy/engine/default.py | 6 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/mapper.py | 15 | ||||
-rw-r--r-- | test/orm/test_unitofwork.py | 26 |
4 files changed, 45 insertions, 6 deletions
@@ -146,6 +146,10 @@ CHANGES The internal BackRef() is gone and backref() returns a plain tuple that is understood by RelationProperty. + - The version_id_col feature on mapper() will raise a warning when + used with dialects that don't support "rowcount" adequately. + [ticket:1569] + - Deprecated or removed: * 'allow_null_pks' flag on mapper() is deprecated. It does nothing now and the setting is "on" in all cases. diff --git a/lib/sqlalchemy/engine/default.py b/lib/sqlalchemy/engine/default.py index fecc16b3c..40939d1a8 100644 --- a/lib/sqlalchemy/engine/default.py +++ b/lib/sqlalchemy/engine/default.py @@ -107,7 +107,11 @@ class DefaultDialect(base.Dialect): #self.supports_unicode_statements = True #self.supports_unicode_binds = True #self.returns_unicode_strings = True - + + @property + def dialect_description(self): + return self.name + "+" + self.driver + def initialize(self, connection): try: self.server_version_info = self._get_server_version_info(connection) diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index 9b5583afa..881f0d546 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -1414,7 +1414,7 @@ class Mapper(object): if update: mapper = table_to_mapper[table] clause = sql.and_() - + for col in mapper._pks_by_table[table]: clause.clauses.append(col == sql.bindparam(col._label, type_=col.type)) @@ -1429,9 +1429,16 @@ class Mapper(object): rows += c.rowcount - if c.supports_sane_rowcount() and rows != len(update): - raise exc.ConcurrentModificationError("Updated rowcount %d does not match number of objects updated %d" % (rows, len(update))) - + if connection.dialect.supports_sane_rowcount: + if rows != len(update): + raise exc.ConcurrentModificationError( + "Updated rowcount %d does not match number of objects updated %d" % + (rows, len(update))) + + elif mapper.version_id_col is not None: + util.warn("Dialect %s does not support updated rowcount " + "- versioning cannot be verified." % c.dialect.dialect_description) + if insert: statement = table.insert() for state, params, mapper, connection, value_params in insert: diff --git a/test/orm/test_unitofwork.py b/test/orm/test_unitofwork.py index 37575ff3e..6b628d826 100644 --- a/test/orm/test_unitofwork.py +++ b/test/orm/test_unitofwork.py @@ -67,10 +67,12 @@ class VersioningTest(_base.MappedTest): class Foo(_base.ComparableEntity): pass + @testing.emits_warning(r'.*does not support updated rowcount') @engines.close_open_connections @testing.resolve_artifact_names def test_basic(self): - mapper(Foo, version_table, version_id_col=version_table.c.version_id) + mapper(Foo, version_table, + version_id_col=version_table.c.version_id) s1 = create_session(autocommit=False) f1 = Foo(value='f1') @@ -113,6 +115,27 @@ class VersioningTest(_base.MappedTest): @engines.close_open_connections @testing.resolve_artifact_names + def test_notsane_warning(self): + save = testing.db.dialect.supports_sane_rowcount + testing.db.dialect.supports_sane_rowcount = False + try: + mapper(Foo, version_table, + version_id_col=version_table.c.version_id) + + s1 = create_session(autocommit=False) + f1 = Foo(value='f1') + f2 = Foo(value='f2') + s1.add_all((f1, f2)) + s1.commit() + + f1.value='f1rev2' + assert_raises(sa.exc.SAWarning, s1.commit) + finally: + testing.db.dialect.supports_sane_rowcount = save + + @testing.emits_warning(r'.*does not support updated rowcount') + @engines.close_open_connections + @testing.resolve_artifact_names def test_versioncheck(self): """query.with_lockmode performs a 'version check' on an already loaded instance""" @@ -140,6 +163,7 @@ class VersioningTest(_base.MappedTest): s1.close() s1.query(Foo).with_lockmode('read').get(f1s1.id) + @testing.emits_warning(r'.*does not support updated rowcount') @engines.close_open_connections @testing.resolve_artifact_names def test_noversioncheck(self): |