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:[EMAIL PROTECTED] > 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" <[EMAIL PROTECTED]> > To: "'Zope-DB List'" <zope-db@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@zope.org > http://mail.zope.org/mailman/listinfo/zope-db _______________________________________________ Zope-DB mailing list Zope-DB@zope.org http://mail.zope.org/mailman/listinfo/zope-db