Re: [sqlalchemy] notin_ passed empty sequence with unexpected substitution

2013-08-07 Thread Michael Bayer

On Aug 6, 2013, at 8:14 PM, Victor Reichert vfr...@gmail.com wrote:

 Hi,
 
 I'm running:
 
 selected_eventids = []
 
 selected_event = 
 self.session.query(Master_Simulation_Event).filter(Master_Simulation_Event.cumulative_probability
  = selection_percentile, 
 Master_Simulation_Event.event_id.notin_(selected_eventids) ).\
 order_by(Master_Simulation_Event.cumulative_probability - 
 selection_percentile).first()
 
 And it generates:
 
 2013-08-06 18:03:43,196 INFO sqlalchemy.engine.base.Engine SELECT TOP 1 
 master_simulation_events.id AS master_simulation_events_id, 
 master_simulation_events.event_id AS master_simulation_events_event_id, 
 master_simulation_events.rate AS master_simulation_events_rate, 
 master_simulation_events.sample_probability AS 
 master_simulation_events_sample_probability, 
 master_simulation_events.cumulative_probability AS 
 master_simulation_events_cumulative_probability 
 FROM master_simulation_events 
 WHERE master_simulation_events.cumulative_probability = ? AND 
 master_simulation_events.event_id != master_simulation_events.event_id ORDER 
 BY master_simulation_events.cumulative_probability - ?
 2013-08-06 18:03:43,196 INFO sqlalchemy.engine.base.Engine 
 (0.19528160149168805, 0.19528160149168805)
 
 The important part is the notin_([]) is translated to:  
 master_simulation_events.event_id != master_simulation_events.event_id
 
 I recieve the following warning:
 
 C:\Python27\lib\site-packages\sqlalchemy\sql\expression.py:1982: SAWarning: 
 The IN-predicate on master_simulation_events.event_id was invoked with an 
 empty sequence. This results in a contradiction, which nonetheless can be 
 expensive to evaluate.  Consider alternative strategies for improved 
 performance.
   return o[0](self, self.expr, op, *(other + o[1:]), **kwargs)
 
 While it doesn't make a lot of sense to pass an empty list to an in_ clause I 
 think passing an emtpy list list to notin_ clause is OK and it shouldn't be 
 replaced.

fixed in 3302187fea0ffd431b980081e7bc483ea364da2b (0.8.3) and 
34ef21909bd6ed3574e37c345ca9e (master).  You don't really need notin in any 
case, just use ~col.in_([]) for now.




signature.asc
Description: Message signed with OpenPGP using GPGMail


[sqlalchemy] notin_ passed empty sequence with unexpected substitution

2013-08-06 Thread Victor Reichert
Hi,

I'm running:

selected_eventids = []

selected_event = 
self.session.query(Master_Simulation_Event).filter(Master_Simulation_Event.cumulative_probability
 
= selection_percentile, 
Master_Simulation_Event.event_id.notin_(selected_eventids) ).\
order_by(Master_Simulation_Event.cumulative_probability - 
selection_percentile).first()

And it generates:

2013-08-06 18:03:43,196 INFO sqlalchemy.engine.base.Engine SELECT TOP 1 
master_simulation_events.id AS master_simulation_events_id, 
master_simulation_events.event_id AS master_simulation_events_event_id, 
master_simulation_events.rate AS master_simulation_events_rate, 
master_simulation_events.sample_probability AS 
master_simulation_events_sample_probability, 
master_simulation_events.cumulative_probability AS 
master_simulation_events_cumulative_probability 
FROM master_simulation_events 
WHERE master_simulation_events.cumulative_probability = ? AND 
master_simulation_events.event_id != master_simulation_events.event_id 
ORDER BY master_simulation_events.cumulative_probability - ?
2013-08-06 18:03:43,196 INFO sqlalchemy.engine.base.Engine 
(0.19528160149168805, 0.19528160149168805)

The important part is the notin_([]) is translated to: 
 master_simulation_events.event_id != master_simulation_events.event_id

I recieve the following warning:

C:\Python27\lib\site-packages\sqlalchemy\sql\expression.py:1982: SAWarning: 
The IN-predicate on master_simulation_events.event_id was invoked with an 
empty sequence. This results in a contradiction, which nonetheless can be 
expensive to evaluate.  Consider alternative strategies for improved 
performance.
  return o[0](self, self.expr, op, *(other + o[1:]), **kwargs)

While it doesn't make a lot of sense to pass an empty list to an in_ clause 
I think passing an emtpy list list to notin_ clause is OK and it shouldn't 
be replaced.

Is this a bug?

~Victor

-- 
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 sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.