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 <[EMAIL PROTECTED]> 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:[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'" <[email protected]>
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
[email protected]
http://mail.zope.org/mailman/listinfo/zope-db

_______________________________________________
Zope-DB mailing list
[email protected]
http://mail.zope.org/mailman/listinfo/zope-db



--
ZOPYX Ltd. & Co. KG - Charlottenstr. 37/1 - 72070 Tübingen - Germany
Web: www.zopyx.com - Email: [EMAIL PROTECTED] - 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

Attachment: pgpX6f3WaiFKL.pgp
Description: PGP signature

_______________________________________________
Zope-DB mailing list
[email protected]
http://mail.zope.org/mailman/listinfo/zope-db

Reply via email to