如何使用python在sql中选择一个很长的id列表

Ric*_*ard 1 python sql

我有一个非常大的数据库,我正在使用,我需要知道如何选择一组没有任何实际模式的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()
Run Code Online (Sandbox Code Playgroud)

我在想,必须有一个更快的方法来做到这一点......我的意思是我的脚本需要搜索一个拥有超过400万id的数据库.有没有办法可以使用select命令一次性抓取它们.我可以使用带有id列表的where语句吗?谢谢

Joh*_*ica 5

您可以使用IN同时查找多个项目:

SELECT * FROM Table WHERE id IN (x, y, z, ...)
Run Code Online (Sandbox Code Playgroud)

所以也许是这样的:

sql = "select * from Table where id in (%s)" % (', '.join(str(id) for id in longIdList))
Run Code Online (Sandbox Code Playgroud)


Bil*_*win 5

是的,您可以使用SQL的IN()谓词将列与一组值进行比较.这是标准SQL,并且每个SQL数据库都支持它.

IN()谓词过于低效或仅仅超过SQL查询的长度限制之前,可以在谓词中放置的值的数量存在实际限制.最大的实用值列表取决于您使用的数据库(在Oracle中它是1000,MS SQL Server在2000左右).我的感觉是,如果你的名单超过几十个值,我会寻求另一个解决方案.

例如,@ ngroot建议在他的答案中使用临时表.有关此解决方案的分析,请参阅本博客StackOverflow常规@Quassnoi:在MySQL中传递参数:IN列表与临时表.

将值列表参数化为SQL查询是一种安全的方法,这可能很棘手.您应该注意SQL注入的风险.

另请参阅Stack Overflow上的这个热门问题: 参数化SQL IN子句?