diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2012-12-08 20:28:43 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2012-12-08 20:28:43 -0500 |
commit | 3859742a91ef73755974a536a2f1a6937594d92b (patch) | |
tree | 356c81fcee40ae1c753f45b1fc4d71bf25010951 /lib/sqlalchemy/schema.py | |
parent | 33bafcb132ed959f072f98fa488b05e5628f097b (diff) | |
download | sqlalchemy-3859742a91ef73755974a536a2f1a6937594d92b.tar.gz |
Fixed bug where using server_onupdate=<FetchedValue|DefaultClause>
without passing the "for_update=True" flag would apply the default
object to the server_default, blowing away whatever was there.
The explicit for_update=True argument shouldn't be needed with this usage
(especially since the documentation shows an example without it being
used) so it is now arranged internally using a copy of the given default
object, if the flag isn't set to what corresponds to that argument.
Also in 0.7.10. [ticket:2631]
Diffstat (limited to 'lib/sqlalchemy/schema.py')
-rw-r--r-- | lib/sqlalchemy/schema.py | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/lib/sqlalchemy/schema.py b/lib/sqlalchemy/schema.py index 4f3655a1d..553936299 100644 --- a/lib/sqlalchemy/schema.py +++ b/lib/sqlalchemy/schema.py @@ -945,7 +945,7 @@ class Column(SchemaItem, expression.ColumnClause): if self.server_default is not None: if isinstance(self.server_default, FetchedValue): - args.append(self.server_default) + args.append(self.server_default._as_for_update(False)) else: args.append(DefaultClause(self.server_default)) @@ -957,7 +957,7 @@ class Column(SchemaItem, expression.ColumnClause): if self.server_onupdate is not None: if isinstance(self.server_onupdate, FetchedValue): - args.append(self.server_onupdate) + args.append(self.server_onupdate._as_for_update(True)) else: args.append(DefaultClause(self.server_onupdate, for_update=True)) @@ -1854,6 +1854,19 @@ class FetchedValue(_NotAColumnExpr, events.SchemaEventTarget): def __init__(self, for_update=False): self.for_update = for_update + def _as_for_update(self, for_update): + if for_update == self.for_update: + return self + else: + return self._clone(for_update) + + def _clone(self, for_update): + n = self.__class__.__new__(self.__class__) + n.__dict__.update(self.__dict__) + n.__dict__.pop('column', None) + n.for_update = for_update + return n + def _set_parent(self, column): self.column = column if self.for_update: |