2008-11-24 39 views
6

有谁知道是否有办法自动扩展Python中的列表,并用逗号分隔?我正在编写一些使用MySQLdb库的Python代码,并且我试图用某些关键值动态更新MySQL数据库中的行列表。自动扩展带格式化输出的Python列表

例如,在下面的代码中,我希望将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() 

任何帮助将不胜感激!

回答

18

尝试:

",".join(map(str, record_ids)) 

",".join(list_of_strings)通过用逗号分隔

,如果你有一个数字的列表,map(str, list)将其转换为字符串

+0

谢谢,这并获得成功! – m0j0 2008-11-24 22:23:19

2

而且列表加入字符串列表对于给定的答案,请注意,您可能希望特例为空列表案例,因为“where rec_id in()”不是有效的SQL,因此您将收到错误消息。

也要非常小心的像这样手动构建SQL,而不是仅仅使用自动转义的参数。对于整数列表来说,它可以工作,但是如果你正在处理从用户输入中接收到的字符串,那么通过这样做会造成巨大的SQL注入漏洞。

+0

+1请使用绑定变量。 http://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks – 2008-11-24 23:10:36

+0

这只会从数据库读取数据和更新数据。它永远不会使用从互联网输入的数据。 – m0j0 2008-11-24 23:14:24

+0

小心:数据库中的大量数据最终由用户输入。即使您的案例非常安全,但稍后有类似问题的更高版本可能会决定复制现有代码。即使安全,关心这些事情也是一个好主意。更好地强化和表现好的习惯而不是坏的。 – Brian 2008-11-25 09:42:39

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注入攻击绑定所有动态列表。

0

略有不同的替代达斯汀的回答是:

sqlStmt=("UPDATE apps.sometable SET lastmod=SYSDATE() where rec_id in (%s)" 
    % ', '.join(['?' * len(record_ids]))) 
0

Alternitavely,使用更换

sqlStmt="UPDATE apps.sometable SET lastmod=SYSDATE() where rec_id in " + 
    record_ids.__str__().replace('[','(').replace(']',')')