I'm using the separate table versioning code from *history_meta.py*. When I
try to save a new object, I get this:
[...]
File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/orm/session.py",
line 1282, in _autoflush
self.flush()
File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/orm/session.py",
line 2004, in flush
self._flush(objects)
File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/orm/session.py",
line 2031, in _flush
self.dispatch.before_flush(self, flush_context, objects)
File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/event/attr.py",
line 218, in __call__
fn(*args, **kw)
File "/usr/share/foo/app/server/history_meta.py", line 290, in
before_flush
create_version(obj, session)
File "/usr/share/foo/app/server/history_meta.py", line 256, in
create_version
attr[hist_col.key] = a[0]
IndexError: tuple index out of range
I added some logging, and it seems that this happens for attributes that I
haven't assigned a value to, and which have a default value of *None*. -
because in this line in *create_version*, *a*, *u* and *d* are all empty:
a, u, d = attributes.get_history(obj, prop.key)
If I actually assign *None* to the attribute before saving, then it works
fine. It also works if I apply this patch to *history_meta.py*:
diff --git a/src/app/server/history_meta.py b/src/app/server/history_meta.py
index 02b54e0..17cd87f 100644
--- a/src/app/server/history_meta.py
+++ b/src/app/server/history_meta.py
@@ -240,10 +240,13 @@ def create_version(obj, session, deleted=False):
obj_changed = True
elif u:
attr[hist_col.key] = u[0]
- else:
+ elif a:
# if the attribute had no value.
attr[hist_col.key] = a[0]
obj_changed = True
+ else:
+ # The attribute has never had a value
+ attr[hist_col.key] = None
if not obj_changed:
# not changed, but we have relationships. OK
Is this a reasonable thing to do?
Cheers,
Alex
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.