2008-11-24 40 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(']',')')