0

MySQLdb を使用して 3 つの変数を渡す削除クエリを実行しようとしています。クエリは次のように実行されます。

self.cursor.execute("""DELETE er.* FROM extension_recording er, 
  extension e, client c 
 WHERE er.extension_id = e.id AND e.client_id = c.id 
  AND c.parent_client_id = %s 
  AND DATE(er.cr_date) BETWEEN '%s' AND '%s'""" , 
(client_id, start_date, end_date))

インデントを許してください。インデントなしでは読みにくいようです。

そして、何が起こるかは次のとおりです。TypeError: not all arguments converted during string formatting

SQL を文字列としてカーソルに渡そうとしましたが (これは SQL インジェクションに対して脆弱であることはわかっていますが、テストしただけです)、結果は同じです。私はSQLを調べましたが、問題ないようです。

これは、クエリ内の単一引用符で囲まれた日付と関係がありますか? または、他の何か?

4

1 に答える 1

1

トレースバックにヒントが…

Traceback (most recent call last):
  File "/usr/local/bin/recording_archive_newer.py", line 194, in <module>
    print "Error %s deleting from DB" % (sys.exc_info())
TypeError: not all arguments converted during string formatting

問題はクエリではなく、エラー メッセージの出力にあります。

sys.exc_info()は 3 つの要素のタプルを返しますが、文字列でプレースホルダーを 1 つしか指定していません"Error %s deleting from DB"

(sys.exc_info())は 1 つの要素を持つタプルではなく、 として解釈されることに注意してくださいsys.exc_info()。要素が 1 つのタプルにしたい場合は、末尾にコンマが必要です(sys.exc_info(),)

ただし、その行が次のようなブロックの一部である場合...

try:
    # do query
except:
    print "Error %s deleting from DB" % (sys.exc_info())

...元の例外を再発生させたほうがよいでしょう。そうしないと、実際の問題がどこにあるのかを突き止めるのが非常に難しくなります。私はそれを次のように変更することをお勧めします...

try:
    # do query
except:
    print "Error deleting from DB"
    raise

...少なくともデバッグ中は。

于 2013-05-16T16:59:16.957 に答える