[Zope] ZSQLMethodFile?

Peter Bengtsson mail@peterbe.com
Wed, 11 Jun 2003 17:02:09 +0100


>>
>>
>> I'm not sure I understand.
>> Suppose my sql query string looks like this:
>>
>> sqlstatement='''<params>admin_login_name
>> admin_password</params>
> 
> 
> Lose the <params />  part.
> 
> You specify the parameters to the ZSQL method when instantiating the 
> ZSQL object.
> 
> The signature of the ZSQL __init__ looks like this:
> 
>     def __init__(self, id, title, connection_id, arguments, template):
> 
> self is self
> 
> id is the id of the zope object
> 
> title is the title string of the zope object
> 
> connection_id is the id of the database connection
> 
> arguments is a string specifying the keyword args, eg. 
> """admin_login_name:string admin_password:string"""
> 
> template is your sql statement incl. dtml
> 

Ok. I understand.

> 
>> SELECT
>>  *
>> FROM
>>  service_provider
>> WHERE
>> <dtml-let admin_login_name="_.string.upper(admin_login_name)">
>>  UPPER(admin_login_name) = <dtml-sqlvar admin_login_name type="string">
>> </dtml-let>
>>  AND
>>  admin_password = <dtml-sqlvar admin_password type="string">'''
>>
>> How do I then pass the keyword arguments?
>>
>>
>>>>>
>>
>>>
>>>> If I do some os.listdir(...) on my files, I'll be able to hack-parse 
>>>> the parameters and create the methods on the fly with parameters. 
>>>> Added benefit is that I'll be able to use arguments instead of only 
>>>> keyword arguments.
>>>
>>>
>>>
>>>
>>> I THINK you still have to pass keyword args (but I could be mistaken)
>>>
>> IF I wrap them are class methods, will it correctly look like this:
>>
>> def Mysqlstuff(Aq...):
>>     def zsql_method(self, name, age):
>>         return SQL(..., ..., ...)(name=name, age=age)
>>
>> Or do I need anything else?
> 
> 
> This should about work, but it would be more efficient if you stored the 
> ZSQL object somewhere.  Otherwise you'd have to reparse the dtml each 
> time you call zsql_method() and won't be able to use zope caching.
> 

You're right.
So, if I don't wrap them like that but do define them as attributes, 
they don't have to reparse them?
Then I can do this:

class Mysqlstuff(Aq...):

     _login = SQL('null','dummy title', dbconnection,
                  'name:string pass:string', sqlfile.read())
     def login(self, name, pass):
         ...do other things such as debug...
         return _login(name=name, pass=pass)

What do you think about that?