[Zope-DB] Using <dtml-var>s in ZSQL methods?

Andreas Jung lists at zopyx.com
Sat Jun 16 15:27:12 EDT 2007


First, Jaroslav is right. One time you're passing a string and next
your passing a list. Make your choice how the API should looks like.

Second..it would be *really* helpful to see the full traceback instead
of just *Keyerror*. It's somewhat boring to ask every time for it :-)

-aj

--On 16. Juni 2007 15:19:10 -0400 Ken Winter <ken at sunward.org> wrote:

> Jaroslav ~
>
> I'm pretty sure that 'delete_this' is a list (of integers), because the
> lines
>
> "
> p = context.REQUEST.get('delete_this')
> s = ', '.join([str(x) for x in p])
> "
>
> process it correctly into the string 's'.  In other words, I think it is
> the same as if p had been assigned a list in this way:
>
> "
> p = [9765, 10058, 11333]
> s = ', '.join([str(x) for x in p])
> "
>
> In either case, s ends up as the string "9765, 10058, 11333".  That's what
> gets passed to the ZSQL method (below), and that's where the trouble seems
> to be.
>
> I will put in another message to this thread documenting some further
> experiments I have done.
>
> ~ Thanks
> ~ Ken
>
>
>> -----Original Message-----
>> From: Jaroslav Lukesh [mailto:lukesh at seznam.cz]
>> Sent: Saturday, June 16, 2007 1:41 AM
>> To: Ken Winter; 'Zope-DB List'
>> Subject: Re: [Zope-DB] Using <dtml-var>s in ZSQL methods?
>>
>> It is just because 'delete_this' is a string, not the list, or vice
>> versa?
>>
>> ----- Original Message -----
>> From: "Ken Winter" <ken at sunward.org>
>> To: "'Zope-DB List'" <zope-db at zope.org>
>> Sent: Saturday, June 16, 2007 5:15 AM
>> Subject: [Zope-DB] Using <dtml-var>s in ZSQL methods?
>>
>>
>> Here's the definition of a ZSQL method, "people_delete_by_id.zsql":
>>
>> "
>> <dtml-comment>
>>   title: Method to delete People by ids given in a comma-separated list
>>   connection_id: my_database
>>   arguments:
>> id_list
>> </dtml-comment>
>>
>> delete from person
>> where person_id in (<dtml-var id_list>)
>> "
>>
>>
>> Here's the puzzle:
>>
>> When I define and test this ZSQL method through the ZMI, passing it a
>> string
>> such as "9765, 10058, 11333", it indeed deletes the rows with those
>> values on person_id.
>>
>> BUT when I invoke the same ZSQL method from a Python script with the
>> following code:
>>
>> "
>> p = context.REQUEST.get('delete_this')
>> if p:
>>     s = ', '.join([str(x) for x in p])
>>     context.people_delete_by_id(id_list=s)
>> "
>>
>> ...and with a REQUEST variable 'delete_this' that comes from this snippet
>> of
>> a form in a page template:
>>
>> "
>> <form method="post" name="form2"
>> tal:attributes="action string:${here/absolute_url}/${template/id};">
>>
>> <input type="hidden" name="form.submitted" value="1" />
>> <p class="error_message" tal:define="err errors/n|nothing"
>> tal:condition="err"><b tal:content="err" /></p>
>>
>> <table>
>> <tr tal:repeat="person options/data"><a name="id" id="id"
>> tal:attributes="name person/person_id"></a>
>>     <td tal:condition="not:options/selectall | nothing"
>> <input type="checkbox" name="delete_this:list:int" value=""
>> tal:attributes="value person/person_id"/>
>>     </td>
>> ...
>> </tr>
>> </table>
>> ...
>> </form>
>> "
>>
>> ...and with the same three person_ids (9765, 10058, 11333) the 4th line
>> of the Python script evokes an error:
>>
>> "
>> KeyError: 'id_list'
>> "
>>
>> The core idea is that the string id_list is passed into the ZSQL method,
>> where it is spliced into the "delete...where" clause via the <dtml-var
>> id_list>) to provide the list of person_ids to delete.
>>
>>
>> Here's the question:
>>
>> WHY?
>>
>> ~ TIA
>> ~ Ken
>>
>> P.S.  I know that <dtml-var...> rather than <dtml-sqlvar...> is an
>> unorthodox and apparently undocumented construct to use within a ZSQL
>> definition.  But I need it because <dtml-sqlvar...> malformats the
>> string. And if doing this trick is a no-no, how come it works in the ZMI
>> test but not when called from Python?  More importantly, how can I get
>> it to work from Python?
>>
>> _______________________________________________
>> Zope-DB mailing list
>> Zope-DB at zope.org
>> http://mail.zope.org/mailman/listinfo/zope-db
>
> _______________________________________________
> Zope-DB mailing list
> Zope-DB at zope.org
> http://mail.zope.org/mailman/listinfo/zope-db



-- 
ZOPYX Ltd. & Co. KG - Charlottenstr. 37/1 - 72070 Tübingen - Germany
Web: www.zopyx.com - Email: info at zopyx.com - Phone +49 - 7071 - 793376
Registergericht: Amtsgericht Stuttgart, Handelsregister A 381535
Geschäftsführer/Gesellschafter: ZOPYX Limited, Birmingham, UK
------------------------------------------------------------------------
E-Publishing, Python, Zope & Plone development, Consulting
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 186 bytes
Desc: not available
Url : http://mail.zope.org/pipermail/zope-db/attachments/20070616/eabb904b/attachment.bin


More information about the Zope-DB mailing list