您可以使用this SO answer中的三元表达式(v2.5)。但我建议:names = ['campaignID', 'keywordID' ... ]
data = itertools.izip_longest(names, ex_li)
key_string = ','.join(data.keys())
query = '...(' + key_string + ')...( %s, %s, %s, %s )' #no % here
cursor.execute(query, data.values())
说明:
为了回答您修改后的问题,即测试ex_li[0],然后分配其值,检查空白并在找到空白时分配它是没有意义的,您可以这样做:
^{pr2}$
那么如果ex_li[0]是{},这就是你在{}中得到的结果。您提到了list index out of bounds,但是在更新的代码中不会发生这种情况,除非您的列表长度错误。在
但在更高级别上,您可以完全删除这些if语句:(campaignID, keywordID, ...) = ex_li
这是元组解包。或者,构建一个字典,这似乎更有用,因为您需要将ID同时视为数据和选择器:names = ['campaignID', 'keywordID' ... ]
data = zip(names, ex_li)
# now have data = {'campaignID': ex_li[0], ... }
您可以适当地构造查询:query = 'insert into Performance report (' + ','.join(data.keys()) + ') ' +
'values (' + ','.join("'"+elem+"'" for elem in data.values()) + ')'
一种改进可能是,如果您得到None而不是一个空字符串(它将变成'None'作为字符串),然后修改为zip读取的值:data = zip(names, (elem or '' for elem in ex_li))
这应该是空字符串而不是“None”。在
如果thg435是正确的,您有时会得到一个更短的列表,那么您可以压缩一些额外的'':data = zip(names, itertools.chain((elem or '' for elem in ex_li),
itertools.repeat('')))
在这里,repeat将给出一个''的无休止的列表,chain将从exu li获取元素,直到它用完为止,然后从repeat开始获取{}。zip会一直运行到一个或其他迭代器用完,所以当{}用尽时,它将停止。或者,如果希望分别处理None值,可以izip_longest:data = itertools.izip_longest(names, ex_li)
key_string = ','.join(data.keys())
value_string = ','.join("'"+str+"'" for str in
(elem or '' for elem in data.values()))
query = '...(' + key_string + ')....(' + value_string + ')...'
或者为了便于阅读:def quotify(str):
return "'"+str+"'"
但是不要这样做。使用光标.执行在DB API中,而不是自己引用值,正如许多问题所证明的那样(例如Python: get escaped SQL string):query = '...(' + key_string + ')...( %s, %s, %s, %s )' #no % here
cursor.execute(query, data.values())
这允许dbapi为您正确地进行转义,防止注入攻击或事故。在