On Jan 12, 2011, at 11:20 AM, neurino wrote: > Well as I wrote ordering involves everything, also forms creation with > formalchemy (make a select where all sensors are ordered that way etc) > anyway I understand your point of view. > >> quickest is a "where sensor id not in (query)", as a simple WHERE clause > > Problem comes when Sensor primary key is composite (id_cu + > id_meas)... > > The good 'ol python comes in handy anyway: > >>>> all = Session.query(model.Sensor).all() >>>> selected = Session.query(model.Sensor).filter( > ... model.Sensor.id_cu==model.ViewOpt.id_cu).filter( > ... model.Sensor.id_meas==model.ViewOpt.id_meas).filter( > ... model.ViewOpt.id_view==1).all() >>>> diff = [sens for sens in all if sens not in selected] >>>> len(all), len(selected), len(diff) > (154, 6, 148) > > We're talking of working on max total 200/300 sensors. > > The OR way did not filter anything (maybe I made somwthing wrong).
Oh you know what, I completely forgot the best solution. It *is* documented on query.order_by() though which is an argument for....checking! pass None to query.order_by(). That disables all order_by's for that query. So go back to your except_() and use except_(q.order_by(None)). > > Greetings > > On Jan 12, 4:04 pm, Michael Bayer <mike...@zzzcomputing.com> wrote: >> On Jan 12, 2011, at 8:46 AM, neurino wrote: >> >>> I need always the same order_by in all app and it could be subject of >>> modification and / or integration in the near future so which better >>> place than mapper to define it once instead of any time I do a query? >> >> It sounds like the ordering here is for the purposes of view logic so I'd >> have view logic that is factored down to receive Query objects that return >> Sensor rows, the view logic then applies the .order_by() to the Query. >> I.e. in a web app I use a Paginator object of some kind that does this, >> given a Query. This is probably a reason I don't like "order_by" to be >> within mapper(), it doesn't define persistence, rather a view. >> >> >> >>> Anyway do you think there are alternate paths to get `all sensors but >>> already choosen` which are "order_by" compatible? >> >> quickest is a "where sensor id not in (query)", as a simple WHERE clause, or >> use OR, "query sensor where sensor.cu != cu OR sensor.meas != meas OR >> sensor.view != view". "Except" is not as widely used and I think its not >> even supported by all backends, even though it is a nice logical set >> operator, its got annoying quirks like this one. >> >> >> >> >> >> >> >> >> >>> Thanks for your support >> >>> On Jan 12, 2:38 pm, Michael Bayer <mike...@zzzcomputing.com> wrote: >>>> On Jan 12, 2011, at 7:28 AM, neurino wrote: >> >>>>> I have this model: >> >>>>> ``I organize views with many view_options each one showing a sensor. >>>>> A sensor can appear just once per view.`` >> >>>>> sensors = Table('sensors', metadata, >>>>> Column('id_cu', Integer, ForeignKey('ctrl_units.id'), >>>>> primary_key=True, >>>>> autoincrement=False), >>>>> Column('id_meas', Integer, primary_key=True, autoincrement=False), >>>>> Column('id_elab', Integer, nullable=False), >>>>> Column('name', Unicode(40), nullable=False), >>>>> Column('desc', Unicode(80), nullable=True), >>>>> ) >> >>>>> ctrl_units = Table('ctrl_units', metadata, >>>>> Column('id', Integer, primary_key=True, autoincrement=False), >>>>> Column('name', Unicode(40), nullable=False) >>>>> ) >> >>>>> views = Table('views', metadata, >>>>> Column('id', Integer, primary_key=True), >>>>> Column('name', Unicode(40), nullable=False), >>>>> Column('desc', Unicode(80), nullable=True), >>>>> ) >> >>>>> view_opts = Table('view_opts', metadata, >>>>> Column('id', Integer, primary_key=True), >>>>> Column('id_view', Integer, ForeignKey('views.id'), >>>>> nullable=False), >>>>> Column('id_cu', Integer, ForeignKey('ctrl_units.id'), >>>>> nullable=False), >>>>> Column('id_meas', Integer, nullable=False), >>>>> Column('ord', Integer, nullable=False), >>>>> ForeignKeyConstraint(('id_cu', 'id_meas'), >>>>> ('sensors.id_cu', 'sensors.id_meas')), >>>>> #sensor can appear just once per view >>>>> UniqueConstraint('id_view', 'id_cu', 'id_meas'), >>>>> ) >> >>>>> Now I let the user add view_options letting him select the sensor. >>>>> I'd like to show him only the sensors not already selected in other >>>>> options of the same parent view so I tried to use except_ this way: >> >>>>> q = Session.query(model.Sensor) \ >>>>> .except_( >>>>> Session.query(model.Sensor) \ >>>>> .filter(model.Sensor.id_cu==model.ViewOpt.id_cu) \ >>>>> .filter(model.Sensor.id_meas==model.ViewOpt.id_meas) \ >>>>> .filter(model.ViewOpt.id_view==1) >>>>> ) >> >>>>> Sensor mapping has a order_by: >> >>>>> orm.mapper(Sensor, sensors, >>>>> order_by=[sensors.c.id_cu, >>>>> sensors.c.id_meas >>>>> ]) >> >>>>> I get this SQL and this error, probably due to mapping order_by in >>>>> Sensor: >> >>>>> (OperationalError) ORDER BY clause should come after EXCEPT not >>>>> before >>>>> u'SELECT anon_1.sensors_id_cu AS anon_1_sensors_id_cu, >>>>> anon_1.sensors_id_meas AS anon_1_sensors_id_meas, >>>>> anon_1.sensors_id_elab AS anon_1_sensors_id_elab, anon_1.sensors_name >>>>> AS anon_1_sensors_name, anon_1.sensors_desc AS anon_1_sensors_desc >>>>> FROM (SELECT sensors.id_cu AS sensors_id_cu, sensors.id_meas AS >>>>> sensors_id_meas, sensors.id_elab AS sensors_id_elab, sensors.name AS >>>>> sensors_name, sensors."desc" AS sensors_desc >>>>> FROM sensors ORDER BY sensors.id_cu, sensors.id_meas EXCEPT SELECT >>>>> sensors.id_cu AS sensors_id_cu, sensors.id_meas AS sensors_id_meas, >>>>> sensors.id_elab AS sensors_id_elab, sensors.name AS sensors_name, >>>>> sensors."desc" AS sensors_desc >>>>> FROM sensors, view_opts >>>>> WHERE sensors.id_cu = view_opts.id_cu AND sensors.id_meas = >>>>> view_opts.id_meas AND view_opts.id_view = ? ORDER BY sensors.id_cu, >>>>> sensors.id_meas) AS anon_1 ORDER BY anon_1.sensors_id_cu, >>>>> anon_1.sensors_id_meas' >> >>>>> is this supposed to be a bug? >> >>>>> Any alternative solution (and maybe simpler :) ) to get what I need? >> >>>> I suppose its a bug, though I'm not a huge fan of "order_by" on mapper >>>> though, so my recommendation would be to not rely upon that. A solution >>>> in SQLA would be if some flag were passed through to not render built-in >>>> order bys. I've added 2022 targeted for 0.7.xx for that. >> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "sqlalchemy" group. >>> To post to this group, send email to sqlalch...@googlegroups.com. >>> To unsubscribe from this group, send email to >>> sqlalchemy+unsubscr...@googlegroups.com. >>> For more options, visit this group >>> athttp://groups.google.com/group/sqlalchemy?hl=en. > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to sqlalch...@googlegroups.com. > To unsubscribe from this group, send email to > sqlalchemy+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/sqlalchemy?hl=en. > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.