[Sqlalchemy-tickets] [sqlalchemy] #2809: Strange effect with association proxy and event listener
Brought to you by:
zzzeek
|
From: sqlalchemy <mi...@zz...> - 2013-08-26 12:23:00
|
#2809: Strange effect with association proxy and event listener
----------------------+-----------------------------------------
Reporter: schlamar | Owner: zzzeek
Type: defect | Status: new
Priority: medium | Milestone: 0.8.xx
Component: (none) | Severity: no triage selected yet
Keywords: | Progress State: awaiting triage
----------------------+-----------------------------------------
I'm getting this strange traceback in a proprietary codebase.
`job.programs` is an association proxy to `job.job_programs`.
`set_max_stat_program_added` is an event handler listening on
`job.job_programs.append`.
Unfortunately I'm not able to reproduce this issue with a simple test
case. But it looks to me that the flush in the event callback is emitting
a wrong SQL statement related to the association proxy. I can further
investigate and debug this issue if someone gives me instructions but I'm
not allowed to publish the code.
A workaround for this issue is to preload `job.pallets` with `joinedload`
in the query.
{{{
Traceback (most recent call last):
File "tests\test_resources.py", line 251, in test_check_enable
job_res.update(job_id, {'programs': [prog_id], 'enabled': True})
File "mes\resource.py", line 185, in update
job.programs.append(prog)
File "packages\sqlalchemy\ext\associationproxy.py", line 568, in append
self.col.append(item)
File "packages\sqlalchemy\orm\collections.py", line 1057, in append
item = __set(self, item, _sa_initiator)
File "packages\sqlalchemy\orm\collections.py", line 1029, in __set
item = getattr(executor, 'fire_append_event')(item, _sa_initiator)
File "packages\sqlalchemy\orm\collections.py", line 733, in
fire_append_event
item, initiator)
File "packages\sqlalchemy\orm\attributes.py", line 910, in
fire_append_event
value = fn(state, value, initiator or self)
File "packages\sqlalchemy\orm\events.py", line 1496, in wrap
orig_fn(target, value, *arg)
File "mes\model.py", line 81, in set_max_stat_program_added
for pallet in job.pallets:
File "packages\sqlalchemy\orm\attributes.py", line 316, in __get__
return self.impl.get(instance_state(instance), dict_)
File "packages\sqlalchemy\orm\attributes.py", line 613, in get
value = self.callable_(state, passive)
File "packages\sqlalchemy\orm\strategies.py", line 524, in
_load_for_state
return self._emit_lazyload(session, state, ident_key, passive)
File "packages\sqlalchemy\orm\strategies.py", line 585, in
_emit_lazyload
result = q.all()
File "packages\sqlalchemy\orm\query.py", line 2237, in all
return list(self)
File "packages\sqlalchemy\orm\query.py", line 2348, in __iter__
self.session._autoflush()
File "packages\sqlalchemy\orm\session.py", line 1139, in _autoflush
self.flush()
File "packages\sqlalchemy\orm\session.py", line 1818, in flush
self._flush(objects)
File "packages\sqlalchemy\orm\session.py", line 1936, in _flush
transaction.rollback(_capture_exception=True)
File "packages\sqlalchemy\util\langhelpers.py", line 58, in __exit__
compat.reraise(exc_type, exc_value, exc_tb)
File "packages\sqlalchemy\orm\session.py", line 1900, in _flush
flush_context.execute()
File "packages\sqlalchemy\orm\unitofwork.py", line 372, in execute
rec.execute(self)
File "packages\sqlalchemy\orm\unitofwork.py", line 525, in execute
uow
File "packages\sqlalchemy\orm\persistence.py", line 64, in save_obj
table, insert)
File "packages\sqlalchemy\orm\persistence.py", line 569, in
_emit_insert_statements
execute(statement, params)
File "packages\sqlalchemy\engine\base.py", line 662, in execute
params)
File "packages\sqlalchemy\engine\base.py", line 761, in
_execute_clauseelement
compiled_sql, distilled_params
File "packages\sqlalchemy\engine\base.py", line 874, in _execute_context
context)
File "packages\sqlalchemy\engine\base.py", line 1024, in
_handle_dbapi_exception
exc_info
File "packages\sqlalchemy\util\compat.py", line 195, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb)
File "packages\sqlalchemy\engine\base.py", line 867, in _execute_context
context)
File "packages\sqlalchemy\engine\default.py", line 324, in do_execute
cursor.execute(statement, parameters)
IntegrityError: (IntegrityError) job_programs.job_id may not be NULL
u'INSERT INTO job_programs (program_id) VALUES (?)'
(1,)
}}}
--
Ticket URL: <http://www.sqlalchemy.org/trac/ticket/2809>
sqlalchemy <http://www.sqlalchemy.org/>
The Database Toolkit for Python
|