1

SO が「私のコードをデバッグするサービス」ではないことはわかっていますが、何時間もチェックして再試行した後、非常にばかげたものを見逃しているか、MySQLdb モジュールにバグ (または悪いコンパイル) がある可能性があります...

また、投稿されたコードと一緒にいくつかの関連する質問があります...

def NextDocumentIdToCache():
    if not OpenConnection():
        return 0

    # ...setting string values... #

    cur = connection.cursor(mysql.cursors.DictCursor)

    cur.execute('SELECT * FROM documents WHERE resolutions <> %s AND pdf > 0 AND status = %s AND expire > %s AND locked = %s LIMIT 0,1', (resolutions, status, expireLimit, ''))

    rowsCount = cur.rowcount

    if rowsCount==0:
        return 0

    row = cur.fetchone()

    id = row['document_id']    

今からすべてOK。接続が開き、1 行を取得して、関数の最後に返される正しいIDを取得します。

次に、フェッチした行に対して更新操作を実行する必要があります...

    cur.close()

    cur = connection.cursor(mysql.cursors.Cursor)    

カーソルを閉じて、新しいカーソルを開きました。実際にこれを行う必要がありますか?または、同じカーソルを再利用できますか?

    cur.execute("""UPDATE documents SET locked = %s WHERE document_id = %s""", ("worker: rendering pages", id))

これは実際には行を更新しません。例外は発生しません。動作しません。

最後に関数が終了します...

    cur.close()

    return id

また、いくつか質問があります。

違いは何ですか

cur.execute("""UPDATE documents....

cur.execute("UPDATE documents....

私は両方のバージョンを見てきました。三重の二重引用符、単一の二重引用符、単一の単一引用符の機能的な違いは何ですか?

そして最後に

クエリを書くと

cur.execute("""UPDATE documents SET locked = %s WHERE document_id = %d""", ("worker: rendering pages", id))

( %s の代わりに%dに注意してください) エラーが発生します。しかし、idは長整数です、私はチェックしました。では、何が問題なのですか?

ありがとうございました

4

1 に答える 1

2

変更は有効になりません:

取引はしていますか?commit()その場合は必要になります。Python データベース API を定義するPEP 249では、トランザクションを明示的に有効にしていなくても、接続はトランザクションを使用すると述べています。

引用

三重引用符で囲まれた文字列は複数行ですが、一重引用符で囲まれた文字列はそうではありません。

補間

これは実際には文字列補間ではないためです。これらのプレースホルダーは、引用を処理する MySQLdb によって解釈されます。

于 2013-09-28T14:05:09.703 に答える