2011-07-05 73 views
1

我試圖完成類似以下內容:MySQL的動態查詢語句在Python

cursor = db.cursor() 
cursor.execute('INSERT INTO media_files (%s, %s, %s, %s ...) VALUES (%s, %s, %s, %s, ...)', (fieldlist, valuelist)) 
cursor.commit() 

我有2個表,字段列表和值列表,每個包含相同數量的項目。生成動態MySQL查詢語句的最佳方式是哪些列的字段存儲在字段列表中並且值存儲在值列表中?

+0

發佈我的回答後,它發生,我認爲你的名單可能是可變長度的。是這樣嗎? –

回答

3
cursor.execute('INSERT INTO media_files (%s) VALUES (%%s, %%s, %%s, %%s, ...)' % ','.join(fieldlist), valuelist) 

這樣可以很清楚:

sql = 'INSERT INTO media_files (%s) VALUES (%%s, %%s, %%s, %%s, ...)' % ','.join(fieldlist) 
cursor.execute(sql, valuelist) 
+0

要正確確保IM的理解,應該只有一個「%s」的列的即使有字段列表中的多個領域,應該有一個「%% S」因爲這是在值列表每個值?像這樣,假設4列和值? cursor.execute( 'INSERT INTO media_files(%S)VALUES(%% S,%% S,%% S,%% S)' % ''。加入(字段列表),(值列表)) –

+2

如果您使用字符串插值,你失去的SQL逃逸是MySQLdb的不適合你,如果你傳遞一個參數序列 –

+1

@Trent我編輯的語法。 @Rob Cowie適配器不會替代列名稱,或者更好,它將替換它們包裹在引號中,這將導致語法錯誤。所以列名必須在適配器獲取sql字符串之前傳遞。 –

2

光標預計參數作爲一個單一的順序進行傳遞,所以你需要結合 - 以 - 字段和值列表。

itertools.chain()確實如此,但它返回一個生成器,我不確定cursor.execute()將接受,因爲它的參數序列。嘗試一下。如果失敗,與list()

import itertools 
sql = 'INSERT INTO media_files (%s, %s, %s, %s ...) VALUES (%s, %s, %s, %s, ...)' 
cursor.execute(sql, itertools.chain(fieldlist, valuelist)) 

編輯把它包:

該解決方案將工作。這會導致字段名稱被轉義並用引號包裝,這會導致sql語法錯誤。
我會離開這個答案,因爲它可能會成爲一個有用的例子,但看@ Trent的答案的解決方案。