2012-02-02 4 views
2

これはおそらくです。本当にのばかげた問題ですが、私は数時間それを見ていて、それを解決することはできません。Pythonアップデートカーソルの問題 - %s記号のエラー?

は、だからここに行く:

def updateEntryAsYoutubeProcessing(self,conn,id): 
      cursor = conn.cursor() 
      try: 
        numberAffected = cursor.execute("update new_files set is_youtube = 1 where id=%s",(id)) 
        conn.commit() 
      except MySQLdb.IntegrityError,e: 
        logging.warn("update failed with error \n\t%d:%s",e.args[0],e.args[1]) 
        raise 
      finally: 
        cursor.close() 

このコード常にエラーで結果:

Traceback (most recent call last): 
    File "mydaemon.py", line 28, in loopForEachFileInDirectory 
    self.updateEntryAsYoutubeProcessing(conn,id) 
    File "mydaemon.py", line 80, in updateEntryAsYoutubeProcessing 
    numberAffected = cursor.execute("update new_files set is_youtube = 1 where id=%s",(id)) 
    File "/usr/lib/pymodules/python2.6/MySQLdb/cursors.py", line 166, in execute 
    self.errorhandler(self, exc, value) 
    File "/usr/lib/pymodules/python2.6/MySQLdb/connections.py", line 35, in defaulterrorhandler 
    raise errorclass, errorvalue 
    ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%s' at line 1") 

私は二重引用符、トリプル二重引用符で自分のコードを試してみた、として定義されたSQL変数と実行に配置、私が考えることができるすべて。

何が欠けていますか?

私はデータベース上でsqlを試しましたが、正常に動作しました(%sを値obviに置き換えて)。

編集: 問題は、私はでした。実際にはというIDはありませんでした。私が持っていた次の問題は、回答に記されているように(ありがとう!)、タプルが(id)(id,)にする必要があったからです。

タプルであるため、「非型」エラーがスローされます。ありがとうございます、明らかに私はタイプルを使用するようにコードを修正しています(また、データベースにNoneを挿入しないでください)

答えて

3

は、引数はシーケンスでなければならず、(id)はタプルではありませんが、(id、)はです。これを試してください:

cursor.execute("update new_files set is_youtube = 1 where id=%s",(id,)) 
+0

あなたは奇妙なことを知っていますか? 1分に4つの答えがあるときは、そのうちの1つを試してみて、戻ってきて、ほぼすべて*答えが消えてしまった、正解の人がいなくなった、他の誰かが彼を置き換えた - 。私はうんざりしている、あなたは正しい、そして今は夕食の時間だ – bharal

1

docsに示すように配列として渡してみてください。

cursor.execute("update new_files set is_youtube = 1 where id=%s", [id]) 

EDIT:以下のでSQLインジェクションの脆弱性のやってはいけない事の例である - あなたは%ではなく,あなたの文字列内のフォーマット必要

以下のコメントを参照してください。

# NOT SAFE 
"update new_files set is_youtube = 1 where id=%s" % id 
+2

-1を試し、パラメータ化クエリを使用しないと、SQLインジェクションの脆弱性を得るための良い方法です。 PythonのDBAPIは、これを防ぐためにパラメータを別々の引数として渡すことをサポートしています。 – interjay

+1

@interjay申し訳ありませんが、それは絶対に正しいです。私は投稿を残しましたが、他の人たちも同じミスをしないように編集しました。 – zackdever

+0

+1あなたが説明をつけたので、私はなぜカンマを使っていたのか分からなかったので、 – bharal

1

スケープタイプは(変数)ですので、このタイプのエラーメッセージがあります。

トレースバック(最新の呼び出しの最後): cur.callprocで ファイル "./lock.py"、16行目、( "ldap_lock"、{} tckimlik) 例外TypeError:引数はシーケンス

でなければなりません

cursor.callproc( "sp_name"、(ID))