diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-05-04 18:27:12 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-05-04 18:27:12 +0000 |
| commit | cea2e8fa64a52c96607bc20f1a5f5b5b16245787 (patch) | |
| tree | 318d0b681979c40ff0d0aa23614846cabdfc7169 /lib/sqlalchemy | |
| parent | 7de3caf5b93dd347de27373329a406d51155e7f9 (diff) | |
| download | sqlalchemy-cea2e8fa64a52c96607bc20f1a5f5b5b16245787.tar.gz | |
- many-to-many relationships properly set the type of bind params
for delete operations on the association table
- many-to-many relationships check that the number of rows deleted
from the association table by a delete operation matches the expected
results
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/orm/dependency.py | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/lib/sqlalchemy/orm/dependency.py b/lib/sqlalchemy/orm/dependency.py index e623fd2a1..0c0dacd20 100644 --- a/lib/sqlalchemy/orm/dependency.py +++ b/lib/sqlalchemy/orm/dependency.py @@ -362,11 +362,15 @@ class ManyToManyDP(DependencyProcessor): self._synchronize(obj, child, associationrow, False, uowcommit) uowcommit.attributes[(self, "manytomany", obj, child)] = True secondary_delete.append(associationrow) + if len(secondary_delete): secondary_delete.sort() # TODO: precompile the delete/insert queries? - statement = self.secondary.delete(sql.and_(*[c == sql.bindparam(c.key) for c in self.secondary.c if c.key in associationrow])) - connection.execute(statement, secondary_delete) + statement = self.secondary.delete(sql.and_(*[c == sql.bindparam(c.key, type=c.type) for c in self.secondary.c if c.key in associationrow])) + result = connection.execute(statement, secondary_delete) + if result.supports_sane_rowcount() and result.rowcount != len(secondary_delete): + raise exceptions.ConcurrentModificationError("Deleted rowcount %d does not match number of objects deleted %d" % (result.rowcount, len(secondary_delete))) + if len(secondary_insert): statement = self.secondary.insert() connection.execute(statement, secondary_insert) |
