使用格式化输出自动扩展Python列表

时间:2008-11-24 22:02:30

标签: python list mysql

有没有人知道是否有办法在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()

任何帮助将不胜感激!

5 个答案:

答案 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(']',')')