2010-09-29 78 views
0

我有INTS的名单,我想加入到一个字符串加入字符串列表蟒蛇用绳子%的替换

ids = [1,2,3,4,5] 

,看起来像“ID = 1或ID = 2或ID = 3或ID = 4或ID = 5'

我现在有一个答案,但我认为这可能是好的,以获得专家组的意见

编辑:更多的信息,反对票塞耶斯... 这不直接生成SQL,这是动态表达式t帽子被发送到使用下面的实体框架的Ado.net数据服务层。目前,服务器中的动态表达式处理程序/ EF4适配器不支持IN子句,因此暂时不得不求助于多个equals语句。

+0

就在你试图做我认为你正在做的事情的时候,你可以在Python中说'id in id'。如果'id'出现在列表'ids'中,它会返回true。 – JoshD 2010-09-29 02:44:43

+0

-1:关于这个的唯一用途是生成动态SQL。这是一件非常非常糟糕的事情。我的机器上的 – 2010-09-29 02:47:42

回答

4
" or ".join("id = %d" % id for id in ids) 
+0

,用新样式替换旧样式格式将其从14usec删除到9.3usec。当然,它仍然不如通过避免字符串格式化得到的7.34 usecs;) – aaronasterling 2010-09-29 02:45:22

+0

@arron - 请你能否详细说明 – 2010-09-29 03:27:02

+0

他正在谈论'“id =%d”%id'与'“id = {}” .format(id)'(旧与新)。 – snapshoe 2010-09-29 03:44:29

1
mystring = 'id =' + 'or id ='.join(str(i) for i in ids) 

如果你想生成动态sql那些在评论中所指出的那样(不知道我怎么错过了它),你应该这样做,因为

mystring = ' or '.join(['id = ?']*len(ids)) 

哪里?旨在替换为数据库库的相应转义序列。对于sqlite3,这是?。对于MySQLdb,它使用printf代码IIRC。然后,您可以将id列表作为第二个参数(通常是)在sql字符串之后传递给游标,并以安全的方式将它们放在那里。这总是正确的。

+0

谢谢你,它在标准意义上不是动态的,而是一个发送到ADO.NET数据服务(下面的EF4 ORM)服务的谓词表达式。 – 2010-09-29 03:32:55