2017-10-22 68 views
0

在我的Cur4.execute中,我試圖比較藝術家姓名與我之前從cur3(name = row [1]), 獲得的名稱,但是出現錯誤:如何在sql中使用字符串在python中執行

Traceback (most recent call last): 
    File "mp2.py", line 49, in <module> 
    cur4.execute('SELECT * FROM artist WHERE artist.name = %s',name) 
    File "C:\python27\lib\site-packages\MySQLdb\cursors.py", line 187, in execute 
    query = query % tuple([db.literal(item) for item in args]) 
TypeError: not all arguments converted during string formatting 

我該如何解決?

cur3 = db.cursor() 
cur3.execute("SELECT image.link, artist.name, detail.detail_id, FROM artist, detail, image WHERE image.artist_id = artist.artist_id AND detail.image_id = image.image_id LIMIT 1") 
ans = cur3.fetchall() 
for row in ans: 
    print row[1:] 
    name = row[1] 
db.close() 

cur4 = db.cursor() 
cur4.execute('SELECT * FROM artist WHERE artist.name = %s',name) 

回答

0

我不是專家,但也許嘗試cur4.execute('SELECT * FROM artist WHERE artist.name = %s',name)而是圍繞與括號中的字符串格式區域得到這個:

cur4.execute(('SELECT * FROM artist WHERE artist.name = %s',name))

編輯:其實,我覺得mshsayem是正確的(原問題的評論)

0

而不是傳遞一個單一的值,你需要通過一個tuple。因此,只要在name參數tuple使用括號和逗號,如:

cur4.execute('SELECT * FROM artist WHERE name = %s', (name,)) 

或者你可以這樣(不推薦):

from MySQLdb import escape_string 
cur4.execute("SELECT * FROM artist WHERE name = '%s'" % escape_string(name)) 

第一種形式採取逃避的照顧,第二個呢不;這就是爲什麼你需要顯式地跳過name參數。第一種形式也利用查詢優化,而第二種形式則沒有。

+0

我嘗試的第一個方式,我得到了錯誤如下:回溯(最後最近一次調用): 文件 「mp2.py」 49行,在 cur4.execute(「SELECT * FROM藝術家WHERE artist.name =%s',(name,)) 文件「C:\ python27 \ lib \ site-packages \ MySQLdb \ cursors.py」,第205行,執行 self.errorhandler(self,exc,value ) 文件「C:\ python27 \ lib \ site-packages \ MySQLdb \ connections.py」,第36行,在defaulterrorhandler中 raise errorclass,errorvalue _mysql_exceptions.InterfaceError:(0,'') –

+0

哦,我明白了。查詢中也有錯誤。你不需要'artist.',只需要'name'就可以了。答案已修復。現在試試。 – mshsayem

0

只需運行一個查詢。以下返回所有藝術家由第一個查詢的單條記錄產生的列。另外,下面的內容替換了顯式連接的隱式連接(25年前的ANSI-92標準)。

sql = "SELECT artist.*" + \ 
     " FROM artist" + \ 
     " INNER JOIN detail ON detail.image_id = image.image_id" + \ 
     " INNER JOIN image ON image.artist_id = artist.artist_id" + \ 
     " LIMIT 1" 

cur4 = db.cursor() 
cur4.execute(sql)