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は長整数です、私はチェックしました。では、何が問題なのですか?
ありがとうございました