Saturday, November 16, 2013

Re: Problem with raw query and using in

On Sat, 16 Nov 2013 22:39:09 +0100, Thorsten Sanders
<thorsten.sanders@gmx.net> declaimed the following:

>I am using mysql and when I write it like (1) then I get int is not
>iterable on the first one, but the raw works, if I do it like (1,) the
>first one works, but the raw one gets again the comma at the end, tried
>several ways always one of both not working, for me it looks kinda there
>is some magic happening and with only 1 value the comma is not removed,
>but is removed with several values.
>
>For now I just use 2 variables one for the raw queries and one for the
>other, not the best solution, but works for now.
>
>
>Am 16.11.2013 16:01, schrieb Javier Guerra Giraldez:
>> On Sat, Nov 16, 2013 at 7:40 AM, Thorsten Sanders
>> <thorsten.sanders@gmx.net> wrote:
>>> realms=[1]
>>> data = AuctionData.objects.filter(itemid__exact=itemid,realm__in=realms)
>>> data2 = AuctionData.objects.raw('SELECT * FROM auctiondata_auctiondata WHERE
>>> itemid_id=%s AND realm_id in %s ',[itemid,realms])
>>
>> not sure if it's related. but most SQL adaptors use a tuple for the
>> IN(...) parameters, not a list.
>>
>> check http://initd.org/psycopg/docs/usage.html#tuples-adaptation
>>

I suspect the main problem is that you need to set up the realms
parameter differently -- along with the query string.

MySQL, and most other SQL systems, as I recall, expect to see

... needle in (first, second, ..., last)

MySQLdb sanitizes parameters by converting them to a string
representation, escaping any special characters, and wrapping it is '
marks.

In the raw query, unless Django has an SQL parser, the above is
generating

select * from auctiondata_auctiondata where itemid_id = 'something' and
realm_id in '[1]'

when what you need to generate is

select * from auctiondata_auctiondata where itemid_id = 'something' and
realm_id in ('1')

(MySQLdb doesn't know what datatype to put in at each %s -- it has first
converted all inputs into safe strings; that's why it uses %s for the
placeholder).

If using a list of values, you'll have to create an SQL format with a
%s for EACH value, not the list

SQL = " ...%%s and stuff in (%s)" % ", ".join("%s" for x in realms)
(if realms is [1, 3, 99] this creates
SQL ="... %s stuff in (%s, %s, %s" )

You then need to flatten the parameters

parms=[itemid].extend(realms)

--
Wulfraed Dennis Lee Bieber AF6VN
wlfraed@ix.netcom.com HTTP://wlfraed.home.netcom.com/

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/0dvf891qg80bsqvvnkanq8mg9b9ufbn0ni%404ax.com.
For more options, visit https://groups.google.com/groups/opt_out.

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home


Real Estate