如何使用Python在SQL中选择一长串ID
我正在处理一个非常大的数据库,想知道怎么选择一大堆没有规律的ID。这是我目前写的代码的一部分:
longIdList = [1, 3, 5 ,8 ....................................]
for id in longIdList
sql = "select * from Table where id = %s" %id
result = cursor.execute(sql)
print result.fetchone()
我在想,肯定有更快的方法来做到这一点……我的脚本需要在超过400万个ID的数据库中搜索。有没有办法用一个选择命令一次性把它们都抓取出来?我可以用带有ID列表的where语句吗?谢谢
3 个回答
3
把这个列表以某种方式进行序列化,比如用逗号分隔或者用XML格式,这些都是不错的选择。然后在另一边创建一个存储过程,这个过程会把序列化后的列表反序列化,放到一个临时表里。接着,你就可以对这个临时表进行内部连接(INNER JOIN)操作了。
6
是的,你可以使用SQL中的IN()
这个功能来把某一列和一组值进行比较。这是标准的SQL,所有的SQL数据库都支持这个功能。
不过,放在IN()
里的值数量是有实际限制的,超过这个数量可能会导致查询效率变低,或者直接超过SQL查询的长度限制。具体能放多少个值,取决于你使用的数据库(比如在Oracle中是1000个,在MS SQL Server中大约是2000个)。我个人觉得,如果你的值列表超过几十个,最好考虑其他解决方案。
例如,@ngroot在他的回答中建议使用临时表。想了解这个解决方案的分析,可以看看StackOverflow常客@Quassnoi的这篇博客:在MySQL中传递参数:IN列表与临时表。
把一组值安全地放入SQL查询中可能会有点棘手。你需要注意SQL注入
的风险,这是一种常见的安全问题。
另外,看看Stack Overflow上这个热门问题:如何参数化SQL的IN子句?
5
你可以使用 IN
来同时查找多个项目:
SELECT * FROM Table WHERE id IN (x, y, z, ...)
所以可能像这样:
sql = "select * from Table where id in (%s)" % (', '.join(str(id) for id in longIdList))