2016-10-04 124 views
0

比方說,我有客戶ID的Python列表如下:select name where id =「in the python list」?

id = ('12','14','15','11',.......) 

陣中擁有1000個值在裏面,我需要插入客戶名稱基於從上面的列表中的ID的表。

我的代碼是這樣的:

ids = ",".join(id) 
sql = "insert into cust_table(name)values(names)where cust_id IN('ids')" 
cursor.execute(sql) 

運行的代碼後,我什麼也沒有插入到表中。我有什麼錯誤?

請幫助:(

+3

謹防[鮑比表(https://xkcd.com/327/)。 –

+0

編程不是/完全/神奇;) – hop

回答

0

您需要格式化字符串。

ids = ",".join(id) 
sql = "insert into cust_table(name)values(names)where cust_id IN('{ids}')" 
cursor.execute(sql.format(ids= ids)) 
+2

參數化的sql會更好。請參閱http://stackoverflow.com/questions/8671702/passing-list-of-parameters-to-sql-in-psycopg2 – hop

0

寫一個變量的名稱爲一個字符串不會奇蹟般地使內容出現在字符串中。

>>> p = 'some part' 
>>> s = 'replace p of a string' 
>>> s 
'replace p of a string' 
>>> s = 'replace %s of a string' % p 
>>> s 
'replace some part of a string' 
>>> s = 'replace {} of a string'.format(p) 
>>> s 
'replace some part of a string' 

你的情況,這將意味着:

>>> sql = "insert into cust_table (name) values (names) where cust_id IN ('%s')" 
>>> ids = ", ".join(id) 
>>> cursor.execute(sql % ids) 

雖然我強烈懷疑您與names有類似的問題。

爲了避免可能的sql注入問題,最好使用「參數化語句」。這看起來像這樣:

>>> sql = 'insert into ... where cust_id IN %s' 
>>> cursor.execute(sql, (id,)) 

python的一些數據庫連接器能夠這樣做,但你可能不是。

一種解決方法可能是這樣的

>>> params = ', '.join(['%s']*len(id)) 
>>> sql = 'insert into ... where cust_id IN (%s)' % params 
>>> cursor.execute(sql, id) 
相關問題