summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2009-12-18 19:11:19 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2009-12-18 19:11:19 +0000
commitfc175f478b4799ba69f457203103f48bdaa6a96d (patch)
treeb7b631eda0ce0c3acda25a49ad24f755d7b76800
parent7f7a908d20bbd91882de8e43d3e66d836e27958a (diff)
downloadsqlalchemy-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--CHANGES4
-rw-r--r--lib/sqlalchemy/engine/default.py6
-rw-r--r--lib/sqlalchemy/orm/mapper.py15
-rw-r--r--test/orm/test_unitofwork.py26
4 files changed, 45 insertions, 6 deletions
diff --git a/CHANGES b/CHANGES
index bebcf8043..154c22a29 100644
--- a/CHANGES
+++ b/CHANGES
@@ -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):