Python MySQLdb子句的多个参数

Python MySQLdb子句的多个参数,python,mysql,mysql-python,Python,Mysql,Mysql Python,下面是我正在处理的数据的一小部分。我可以按我喜欢的任何方式格式化数据。变量“dc”中的数据由值“id1”和“id2”组成。我想做的是能够为“dc”中的所有值发出一条SELECT语句。出于某种原因,无论我在'cursor.execute'语句中尝试什么,还是在'format_strings'变量中尝试什么,我似乎都无法获得能够将两个变量传递给MySQL的正确代码 关于如何格式化数据(“dc”)或代码以执行一条SELECT语句的评论/建议将非常有用 results = () dc = ['103,

下面是我正在处理的数据的一小部分。我可以按我喜欢的任何方式格式化数据。变量“dc”中的数据由值“id1”和“id2”组成。我想做的是能够为“dc”中的所有值发出一条SELECT语句。出于某种原因,无论我在'cursor.execute'语句中尝试什么,还是在'format_strings'变量中尝试什么,我似乎都无法获得能够将两个变量传递给MySQL的正确代码

关于如何格式化数据(“dc”)或代码以执行一条SELECT语句的评论/建议将非常有用

results = ()

dc = ['103,4770634', '42,427752', '64,10122045', '42,13603629', '42,25516425', '103,2748102', '42,1966402', '42,30262834', '42,6667711', '18,13737683', '42,28921168', '42,26076925', '103,3733654', '42,23313527', '64,3307344', '103,3973533', '42,6360982', '48,11846077', '103,3775309', '64,10122050', '42,1965119', '103,4265810', '103,3971645', '103,4962583', '103,689615', '42,22834366', '103,761655', '95,1184', '64,9594482', '42,22855603', '48,8654764', '103,4226756', '42,23366982', '103,3897036', '42,11339650', '101,6369', '42,25830920', '103,5009291', '42,29238961', '59,6299475', '42,22931663', '42,25839056', '43,11864458', '43,41346192', '103,4261645', '42,3747082', '103,4795050', '42,9417503', '103,4245623', '42,61431911']

try:
    format_strings = ','.join(['%s%s'] * len(dc))
    cursor.execute("SELECT * FROM tbl1 WHERE id1=(%s) AND id2=(%s)" % format_strings, (dc))
    res = cursor.fetchall()
    results = results + res
except Exception, e:
    print e
更新

根据@lecumia和@beroe在下面发布的内容,我得出了以下结论,虽然不那么优雅,也可能不是超级高效,但它确实有效

results = ()
id1 = []
id2 = []

dc = ['103,4770634', '42,427752', '64,10122045', '42,13603629', '42,25516425']
for d in dc:
    id1.append(d.split(',')[0])
    id2.append(d.split(',')[1])

try:
    sql = "SELECT * FROM DomainEmails WHERE email_id IN (%s) AND domain_id IN (%s)"
    in_id1 = "'" + "', '".join(id1) + "'"
    in_id2 = "'" + "', '".join(id2) + "'"
    sql = sql % (in_id1, in_id2)
    cursor.execute(sql)
    res = cursor.fetchall()
    results = results + res
except Exception, e:
    print e
实际查询

SELECT * FROM tbl1 WHERE id1 IN ('103', '42', '64', '42', '42') AND id2 IN ('4770634', '427752', '10122045', '13603629', '25516425')
查询结果

这些符合我的期望:

{'id1': 42L, 'id2': 427752L, 'firstseen': datetime.date(2010, 5, 6)}
{'id1': 42L, 'id2': 427752L, 'firstseen': datetime.date(2011, 5, 2)}
{'id1': 42L, 'id2': 13603629L, 'firstseen': datetime.date(2011, 3, 21)}
{'id1': 42L, 'id2': 13603629L, 'firstseen': datetime.date(2011, 4, 17)}
基于

结果
感谢lucemia,基于上述原因,我得到了以下错误:(1064,“您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解在第1行的“%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s)和id2附近使用的正确语法”)。格式字符串的数量与dc的长度相对应(出于测试目的,我将其缩短为16)。同时查看您共享的链接。对我自己的评论进行评论:)从语法上看,所有内容都是正确的:从tbl1中选择*,其中%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s)中的id1没有来自“dc”的实际数据。我认为通过执行以下操作可以解决问题:“cursor.execute(sql,dc)”-现在我得到的是“format string的参数不够”。这与我以前的尝试中遇到的错误相同。我刚刚将“dc”切换到元组,并尝试了“cursor.execute(sql,tuple(dc))”—仍然得到“格式字符串的参数不足”我认为连接
映射
这件事搞砸了。请尝试:
in_id=“”“+”,“”。join(dc)+“”
@beroe:谢谢,不幸的是,这并没有起到作用,这让我从tbl1中选择*,其中id1在('1034770634'、'4242427752'、'6410122045'、'4213603629'、'4225516425')中,id2在('1034770634'、'4242424242427752'、'6410122045'、'4213603629'、'4225516425'))
我真的在寻找一个1:1的映射,所以当id1=103,id2=4770634,并且在“dc”中的所有值上
results = ()

dc = ['103,4770634', '42,427752', '64,10122045', '42,13603629', '42,25516425', '103,2748102', '42,1966402', '42,30262834', '42,6667711', '18,13737683', '42,28921168', '42,26076925', '103,3733654', '42,23313527', '64,3307344', '103,3973533', '42,6360982', '48,11846077', '103,3775309', '64,10122050', '42,1965119', '103,4265810', '103,3971645', '103,4962583', '103,689615', '42,22834366', '103,761655', '95,1184', '64,9594482', '42,22855603', '48,8654764', '103,4226756', '42,23366982', '103,3897036', '42,11339650', '101,6369', '42,25830920', '103,5009291', '42,29238961', '59,6299475', '42,22931663', '42,25839056', '43,11864458', '43,41346192', '103,4261645', '42,3747082', '103,4795050', '42,9417503', '103,4245623', '42,61431911']

try:
    sql = "SELECT * FROM tbl1 WHERE id1 in (%s) AND id2 in (%s)"
    in_ids = ', '.join(map(lambda x: '%s', dc))
    in_ids = in_ids % tuple(dc)
    sql = sql % (in_ids, in_ids)
    cursor.execute(sql)
    res = cursor.fetchall()
    results = results + res
except Exception, e:
    print e
SELECT * FROM tbl1 WHERE id1 in (103,4770634, 42,427752, 64,10122045, 42,13603629, 42,25516425, 103,2748102, 42,1966402, 42,30262834, 42,6667711, 18,13737683, 42,28921168, 42,26076925, 103,3733654, 42,23313527, 64,3307344, 103,3973533, 42,6360982, 48,11846077, 103,3775309, 64,10122050, 42,1965119, 103,4265810, 103,3971645, 103,4962583, 103,689615, 42,22834366, 103,761655, 95,1184, 64,9594482, 42,22855603, 48,8654764, 103,4226756, 42,23366982, 103,3897036, 42,11339650, 101,6369, 42,25830920, 103,5009291, 42,29238961, 59,6299475, 42,22931663, 42,25839056, 43,11864458, 43,41346192, 103,4261645, 42,3747082, 103,4795050, 42,9417503, 103,4245623, 42,61431911) AND id2 in (103,4770634, 42,427752, 64,10122045, 42,13603629, 42,25516425, 103,2748102, 42,1966402, 42,30262834, 42,6667711, 18,13737683, 42,28921168, 42,26076925, 103,3733654, 42,23313527, 64,3307344, 103,3973533, 42,6360982, 48,11846077, 103,3775309, 64,10122050, 42,1965119, 103,4265810, 103,3971645, 103,4962583, 103,689615, 42,22834366, 103,761655, 95,1184, 64,9594482, 42,22855603, 48,8654764, 103,4226756, 42,23366982, 103,3897036, 42,11339650, 101,6369, 42,25830920, 103,5009291, 42,29238961, 59,6299475, 42,22931663, 42,25839056, 43,11864458, 43,41346192, 103,4261645, 42,3747082, 103,4795050, 42,9417503, 103,4245623, 42,61431911)