From: Christopher S. <csi...@gm...> - 2008-02-05 04:35:52
|
I've made great use of passing dicts into select methods, e.g.: queryDict= {'name': 'jim', 'age':34} result = Person.selectBy(**queryDict) How can I combine a dict-based SELECT with an inequality? Like if I wanted to further refine the above query to filter for (e.g.) only those with timeStamp <= datetime.date(2007,1,1) With my pathetically weak background in SQL, I'm afraid I'm not getting anywhere fast with the sqlbuilder documentation. Any help would be much appreciated. TIA, cs |
From: Oleg B. <ph...@ph...> - 2008-02-05 08:35:16
|
On Mon, Feb 04, 2008 at 11:33:21PM -0500, Christopher Singley wrote: > I've made great use of passing dicts into select methods, e.g.: > queryDict= {'name': 'jim', 'age':34} > result = Person.selectBy(**queryDict) > > How can I combine a dict-based SELECT with an inequality? > Like if I wanted to further refine the above query to filter > for (e.g.) only those with timeStamp <= datetime.date(2007,1,1) Hint: how can you express the ineqality with a dict? Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: Frank W. <fra...@no...> - 2008-02-05 10:00:13
|
I think that it won´t be possible the way you want, but why dont you just pass your criteria like this: # didn´t test this one querySet = (Person.q.name == "jim", Person.q.age == 34, Person.q.timeStamp <= datetime.date(2007,1,1)) # but this definately works querySet = AND(Person.q.name == "jim", Person.q.age == 34, Person.q.timeStamp <= datetime.date(2007,1,1)) # or, equivalent: querySet = ((Person.q.name == "jim") & (Person.q.age == 34) & (Person.q.timeStamp <= datetime.date(2007,1,1))) persons = Person.select(querySet) this should work. On Feb 5, 2008 9:35 AM, Oleg Broytmann <ph...@ph...> wrote: > On Mon, Feb 04, 2008 at 11:33:21PM -0500, Christopher Singley wrote: > > I've made great use of passing dicts into select methods, e.g.: > > queryDict= {'name': 'jim', 'age':34} > > result = Person.selectBy(**queryDict) > > > > How can I combine a dict-based SELECT with an inequality? > > Like if I wanted to further refine the above query to filter > > for (e.g.) only those with timeStamp <= datetime.date(2007,1,1) > > Hint: how can you express the ineqality with a dict? > > Oleg. > -- > Oleg Broytmann http://phd.pp.ru/ ph...@ph... > Programmers don't die, they just GOSUB without RETURN. > > > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Microsoft > Defy all challenges. Microsoft(R) Visual Studio 2008. > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > _______________________________________________ > sqlobject-discuss mailing list > sql...@li... > https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss > |
From: Christopher S. <csi...@gm...> - 2008-02-05 13:30:16
|
Gentlemen, Thanks for the feedback. The problem is that I'm writing a base class designed to be subclassed, and a method that will be inherited. Therefore, I don't know when I'm writing the function what the names of the columns will be (except for the DateCol). That's why I'm focused on passing a dict, which lets me write the logic while omitting a predicate. Is there another method for building a select query that allows me not to hardwire the names of the columns into the code, that's also compatible with adding an inequality? Can I do a dict-based select, then do a subselect involving the inequality? TIA, cs On Tuesday 05 February 2008 04:00:10 Frank Wagner wrote: > I think that it won´t be possible the way you want, but why dont you > just pass your criteria like this: > > # didn´t test this one > querySet = (Person.q.name == "jim", Person.q.age == 34, > Person.q.timeStamp <= datetime.date(2007,1,1)) > > # but this definately works > querySet = AND(Person.q.name == "jim", Person.q.age == 34, > Person.q.timeStamp <= datetime.date(2007,1,1)) > # or, equivalent: > querySet = ((Person.q.name == "jim") & (Person.q.age == 34) & > (Person.q.timeStamp <= datetime.date(2007,1,1))) > > persons = Person.select(querySet) > > this should work. > > On Feb 5, 2008 9:35 AM, Oleg Broytmann <ph...@ph...> wrote: > > On Mon, Feb 04, 2008 at 11:33:21PM -0500, Christopher Singley wrote: > > > I've made great use of passing dicts into select methods, e.g.: > > > queryDict= {'name': 'jim', 'age':34} > > > result = Person.selectBy(**queryDict) > > > > > > How can I combine a dict-based SELECT with an inequality? > > > Like if I wanted to further refine the above query to filter > > > for (e.g.) only those with timeStamp <= datetime.date(2007,1,1) > > > > Hint: how can you express the ineqality with a dict? > > > > Oleg. > > -- > > Oleg Broytmann http://phd.pp.ru/ ph...@ph... > > Programmers don't die, they just GOSUB without RETURN. > > > > > > ------------------------------------------------------------------------- > > This SF.net email is sponsored by: Microsoft > > Defy all challenges. Microsoft(R) Visual Studio 2008. > > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > > _______________________________________________ > > sqlobject-discuss mailing list > > sql...@li... > > https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss > > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Microsoft > Defy all challenges. Microsoft(R) Visual Studio 2008. > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > _______________________________________________ > sqlobject-discuss mailing list > sql...@li... > https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss |
From: Oleg B. <ph...@ph...> - 2008-02-05 13:59:17
|
On Tue, Feb 05, 2008 at 08:27:47AM -0500, Christopher Singley wrote: > Is there another method for building a select query that allows me not to > hardwire the names of the columns into the code, that's also compatible with > adding an inequality? You didn't think on my hint, did you: "Hint: how can you express the ineqality with a dict?" > Can I do a dict-based select, then do a subselect involving the inequality? You can try to do .selectBy(**dict).filter(another_expression). Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: Christopher S. <csi...@gm...> - 2008-02-05 14:17:19
|
Oleg, > You didn't think on my hint, did you: > "Hint: how can you express the ineqality with a dict?" I did think, but I'm not very smart. I thought you were implying that it couldn't be done. If you've got a suggestion, I'm all ears, but you'll have to spell it out for the slow students in the class! Python and SQLObject are easy enough to use that they let those of us without any formal programming background do real work. Unfortunately, that doesn't leave us well equipped to answer riddles from developers... Is it something about writing out the query as a string formatted with %s %s placeholders, and then feeding in the dict? I'm at the outer limits of my range here, and gasping for oxygen. > You can try to do .selectBy(**dict).filter(another_expression). Would the syntax be something like: another_expression = 'Person.q.timeStamp <= datetime.date.today()' or another_expression = 'timeStamp <= datetime.date.today()' TIA, cs On Tuesday 05 February 2008 07:59:22 Oleg Broytmann wrote: > On Tue, Feb 05, 2008 at 08:27:47AM -0500, Christopher Singley wrote: > > Is there another method for building a select query that allows me not to > > hardwire the names of the columns into the code, that's also compatible > > with adding an inequality? > > You didn't think on my hint, did you: > "Hint: how can you express the ineqality with a dict?" > > > Can I do a dict-based select, then do a subselect involving the > > inequality? > > You can try to do .selectBy(**dict).filter(another_expression). > > Oleg. |
From: Oleg B. <ph...@ph...> - 2008-02-05 14:39:31
|
On Tue, Feb 05, 2008 at 09:14:51AM -0500, Christopher Singley wrote: > > "Hint: how can you express the ineqality with a dict?" > > If you've got a suggestion, I'm all ears, but you'll have > to spell it out for the slow students in the class! .selectBy() is strictly oriented towards equality test. It's easy to pass a dictionary to .selectBy(). When you need non-equality test one or more keys in your dictionary are special. But there is no way to mark these special keys in syntax like **dict. You know what keys are special but there is no way to express such knowledge with a dictionary. Hence you need to use another, non-dict-based approach. > > You can try to do .selectBy(**dict).filter(another_expression). > > Would the syntax be something like: > another_expression = 'Person.q.timeStamp <= datetime.date.today()' This is the preferred way. Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: Christopher S. <csi...@gm...> - 2008-02-05 15:18:46
|
I appreciate the explanation. > > > You can try to do .selectBy(**dict).filter(another_expression). This looks like it is solving my problem; I appended an .orderBy('-date') to the clause and that also seems to work well. Is there some documentation I can review somewhere that enumerates the functions I can use on selects? The methods are too magic to be approached by help(SelectResults) and dir(SelectResults). Thanks again! SQLObject is a truly excellent piece of software; I love it. cs On Tuesday 05 February 2008 08:39:39 Oleg Broytmann wrote: > On Tue, Feb 05, 2008 at 09:14:51AM -0500, Christopher Singley wrote: > > > "Hint: how can you express the ineqality with a dict?" > > > > If you've got a suggestion, I'm all ears, but you'll have > > to spell it out for the slow students in the class! > > .selectBy() is strictly oriented towards equality test. It's easy to > pass a dictionary to .selectBy(). > When you need non-equality test one or more keys in your dictionary are > special. But there is no way to mark these special keys in syntax like > **dict. You know what keys are special but there is no way to express such > knowledge with a dictionary. Hence you need to use another, non-dict-based > approach. > > > > You can try to do .selectBy(**dict).filter(another_expression). > > > > Would the syntax be something like: > > another_expression = 'Person.q.timeStamp <= datetime.date.today()' > > This is the preferred way. > > Oleg. |
From: Oleg B. <ph...@ph...> - 2008-02-05 15:23:56
|
On Tue, Feb 05, 2008 at 10:16:18AM -0500, Christopher Singley wrote: > Is there some documentation I > can review somewhere that enumerates the functions I can use on selects? Alas! Source code is in sqlobject/sresults.py. Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |