Problem with raw query and using in

53 views
Skip to first unread message

Thorsten Sanders

unread,
Nov 16, 2013, 7:40:52 AM11/16/13
to django...@googlegroups.com
Hello,

wondering if I am doing something wrong or it is a bug, using django
1.5.5, but also tried with 1.6 resulting in the same problem.

When I do the following:

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])

The first query works as expected, but the 2nd one fails, because the
query ends up as:

SELECT * FROM auctiondata_auctiondata WHERE itemid_id='43552' AND
realm_id in ('1',)

The last comma shouldnt be there, if I use more than 1 value with the
realms variable it works and the last comma isn't there.

Greetings,
Thorsten

Javier Guerra Giraldez

unread,
Nov 16, 2013, 10:01:23 AM11/16/13
to django...@googlegroups.com
On Sat, Nov 16, 2013 at 7:40 AM, Thorsten Sanders
<thorsten...@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

--
Javier

Thorsten Sanders

unread,
Nov 16, 2013, 4:39:09 PM11/16/13
to django...@googlegroups.com
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.
Message has been deleted

Thorsten Sanders

unread,
Nov 17, 2013, 5:55:10 AM11/17/13
to django...@googlegroups.com
Thanks, I tried that, it makes the query right, but when I access the
result in a for loop it gives now:

'Cursor' object has no attribute '_last_executed'

Think for now I just stay with using 2 variables, that works fine for
the moment.


Am 17.11.2013 00:38, schrieb Dennis Lee Bieber:
> On Sat, 16 Nov 2013 22:39:09 +0100, Thorsten Sanders
> <thorsten...@gmx.net> declaimed the following:
> 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)
>

huw_at1

unread,
Nov 19, 2013, 8:13:29 AM11/19/13
to django...@googlegroups.com
Hi,

I think I had something similar and followed this thread:


I think this is what Dennis has already said so apologies if it isn't helpful.

Kindest regards
Reply all
Reply to author
Forward
0 new messages