how to replace and string in a "SELECT ... IN ()"
Tino Wildenhain
tino at wildenhain.de
Fri Sep 26 07:23:04 EDT 2008
Hi,
Bruno Desthuilliers wrote:
> bcurtu a écrit :
>> Hi,
>>
>> I have a BIIIIIG problem with the next query:
>>
>> cursor.execute("""
>> SELECT titem.object_id, titem.tag_id
>> FROM tagging_taggeditem titem
>> WHERE titem.object_id IN (%s)
>> """,( eid_list))
>>
>> eid_list is suppossed to be a list of ids = [1,5,9]
>>
>> How can I make it work?
>
> You have to build your sql statement in three stages:
>
> # stage 0: the template
> sql_template = """
> SELECT titem.object_id, titem.tag_id
> FROM tagging_taggeditem titem
> WHERE titem.object_id IN (%s)
> """
>
> # stage 1: build correct place_holders string for the actual number
> # of items in eid_list
> place_holders = ", " .join("%s" for x in xrange(len(eid_list)))
Hm. either ", ".join(["%s"]*len(eid_list))
or ", ".join("%s" for x in eid_list)
should produce the same, wouldn't it? :-)
> # stage 2 : build the effective sql statement
> sql = sql_template % place_holders
>
> # ok, let's go:
> cursor.execute(sql_template, eid_list)
>
>
> NB : you can of course make it in a single statement, but readability
> will suffer:
>
> cursor.execute(
> """
> SELECT titem.object_id, titem.tag_id
> FROM tagging_taggeditem titem
> WHERE titem.object_id IN (%s)
> """ % ", " .join("%s" for x in xrange(len(eid_list))),
> eid_list
> )
I'd think giving the arguments in a form of an array type should
work too. At least in postgres there are references to do so.
Regards
Tino
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 3241 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://mail.python.org/pipermail/python-list/attachments/20080926/649f4088/attachment-0001.bin>
More information about the Python-list
mailing list