On Apr 23, 2010, at 12:13 PM, Paul Balomiri <paulbalom...@gmail.com> wrote:




On 23.04.2010, at 17:03, Michael Bayer wrote:


On Apr 23, 2010, at 9:59 AM, Paul Balomiri <paulbalom...@gmail.com> wrote:

Hi,

Thanks, for your reply. I was aware that it is not just a string substitution,
and that the bindparams also maps the type of the parameters e.t.c.

But is it possible to supply a type /set of types which are or represent a lexical sub-structure ? I might go into doing it, but first i want to check that i'm not reinventing the wheel.

I noticed that the where clause can be supplied several times, so
select( [my_table_metadata]). where(....). where(...) is valid, thus it is possible for this special case to insert a logical expression after the initial select() definition.

I am looking for a similar, but more general case, not necessarily using bindparam where func.now() would be a valid substitution or insertion element into a preexisting expression.


Why not just create a python function that generatively produces the desired statement based on arguments? I don't see the advantage to something more magical than that.
Well, this is what i already do:

lazy_sql_partial = functools.partial(lambda x: select([...] , from_obj(func.a(bindparam('a'),bindparam('b'),x ))) )
and then i name the binding like so:
lazy_sql_unbound = (lazy_sql_partial, ("funcarg"))


At the time when i generate the sql expression I do not know the parameters, not even a default. Those are generated based on user input. in case parameters are missing for a whole expression the whole expression is skipped.

A even simpler expression would be a=1 or a=2 or ....... At the moment i cannot generate such a constuct, which allows me to define a select in one place, and then later add a or_(1,2,...) clause at a certain point.As a special case i could use select ().where(1). where(2)... to get an and_(1,2,...)


An example :
Whenever the map window changes, i need to calculate the dataset which falls out of the current window, and the ones which drops in. Additionally i want to query the a modified sql expression whenever the table changes (modified = with an additional in_ costraining to pks in the table)
to do both i need to regenerate parts of the sql, but not all of it.

The way i do it now seems rather ugly because:
1) (partial_bound_func, ("funcarg")) is error prone ( I know i cold do more reflection to find out argument numbers and names , but it would in the end duplicate the bindparam mechanism )
2) to execute i have to:
- first look for parameters which are arguments to the partial generative functions myselect= lazy_sql_unbound( user input params for partial )
   - then use the remaining parameters in session.execute( )

It just feels like all of this rather belongs into the lib, because it could be all solved by allowing bindparam to have a value of type SQLExpression.

A bind parameter is not a sqlalchemy invention - it would be wrong for us to redefine the term "bind parameter" to mean something entirely different within the library. It is also not permitted by any dbapi so it is impossible in any case.

You can acheive mostly the result you want using a custom SQL expression construct, in conjunction with sqlalchemy.ext.compiler. The construct would peek into a context-specific dictionary for its contents at compile time and forward onto it's corresponding construct. You'd stick the dictionary on the the outermost containing construct, which you can then grab from the compiler instance.



moreover, the expression substitutions could accept bindparams as well.

As a last point , the compiler could check the validity, as it does already.







regards
Paul Balomiri
paulbalom...@gmail.com



On 23.04.2010, at 15:26, Michael Bayer wrote:


On Apr 23, 2010, at 6:58 AM, Paul Balomiri wrote:

Hi,

Several days ago i has a similar question, which
was, perhaps a bit too theoretical. Here is a simple case:

select(text(select * from f(:time)) )

can I supply alternatively either
{time: datetime.datetime(1999,9,9,9,9,9)}
or
{time: " now()"}
I cannot get around that sqlalchemy interprets " now()" as a string, while i try to use the postgres(or other backends) now() function.

bind parameters exist only for the purpose of specifying literal data to be injected as the values into a SQL statement. They cannot be used to modify the lexical structure of a statement. So a lexical unit like "CURRENT TIMESTAMP" or "NOW()" is part of the statement's lexical source and cannot be injected as a bind parameter.

To put it another way, bind parameters are not just string substitutions the way something like "foo %s" % ('bar') is in Python, even though they may look that way.


--
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 .


--
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 .


--
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.

Reply via email to