2017-10-22 14 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)の代わりにしようと、この取得するには、括弧で文字列フォーマットの領域を囲む:実は、私は(mshsayemが正しいと思う:

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

EDITを元の質問のコメント)

0

単一の値を渡す代わりに、tupleを渡す必要があります。最初の形式は、脱出の世話をし、二番目が行う

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

:この(推奨されません)でした

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

それとも:だからのような括弧やカンマを使用してnameパラメータtupleを作りますそうではない。そのため、nameパラメータを明示的にエスケープする必要があります。最初の形式ではクエリの最適化も使用されますが、2番目の形式ではクエリの最適化は行われません。

+0

私は、最初の方法を試みたが、次のように私はエラーを得た:トレースバック(最新の呼び出しの最後を):アーティストFROM cur4.execute( 'SELECTで ファイル "mp2.py"、49行、*ファイル "C:¥python27¥lib¥site-packages¥mysqldb¥cursors.py"、行205、実行中 self.errorhandler(self、exc、value ) ファイル "C:¥python27¥lib¥site-packages¥mysqldb¥connections.py"、36行目、defaulterrorhandler エラークラスerrorvalueを返します。 _mysql_exceptions.InterfaceError:(0、 '') –

+0

ああそうです。クエリに間違いがあります。 'artist 'は必要ありません。単に' name'だけが行います。回答は修正されました。今すぐやってみて下さい。 – mshsayem

0

1つのクエリを実行するだけです。以下は最初のクエリの1レコードの結果であるアーティストの列を返します。また、明示的な結合(ANSI-92の25歳の標準)の暗黙的な結合を次のように置き換えます。

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) 
関連する問題