有没有人知道是否有办法在Python中自动扩展列表,用逗号分隔?我正在编写一些使用MySQLdb库的Python代码,我正在尝试使用某些键值动态更新MySQL数据库中的行列表。
例如,在下面的代码中,我想让record_ids列表中的数值扩展为SQL“IN
”子句。
import MySQLdb
record_ids = [ 23, 43, 71, 102, 121, 241 ]
mysql = MySQLdb.connect(user="username", passwd="secret", db="apps")
mysql_cursor = mysql.cursor()
sqlStmt="UPDATE apps.sometable SET lastmod=SYSDATE() where rec_id in ( %s )"
mysql_cursor.execute( sqlStmt, record_ids )
mysql.commit()
任何帮助将不胜感激!
答案 0 :(得分:18)
尝试:
",".join( map(str, record_ids) )
",".join( list_of_strings )
通过用逗号
如果您有一个数字列表,map( str, list )
会将其转换为字符串列表
答案 1 :(得分:2)
除了给定的答案之外,请注意您可能希望特殊情况下的空列表情况为“where rec_id in ()
”不是有效的SQL,因此您将收到错误。
同样要非常小心这样手动构建SQL,而不是仅仅使用自动转义的参数。对于整数列表,它会起作用,但是如果你处理从用户输入接收到的字符串,那么你就会通过这种方式打开一个巨大的SQL注入漏洞。
答案 2 :(得分:1)
我这样做(为了确保我使用绑定):
sqlStmt=("UPDATE apps.sometable SET lastmod=SYSDATE() where rec_id in (%s)"
% ', '.join(['?' for n in record_ids]))
mysql_cursor.execute(sqlStmt, record_ids)
mysql.commit()
这适用于您想要绑定的所有动态列表,而不会让您受到SQL注入攻击。
答案 3 :(得分:0)
与达斯汀的答案略有不同:
sqlStmt=("UPDATE apps.sometable SET lastmod=SYSDATE() where rec_id in (%s)"
% ', '.join(['?' * len(record_ids])))
答案 4 :(得分:0)
Alternitavely,使用替换:
sqlStmt="UPDATE apps.sometable SET lastmod=SYSDATE() where rec_id in " +
record_ids.__str__().replace('[','(').replace(']',')')