Python で MySQLDB を使用して単純なフェッチを実行しようとしています。
2 つのテーブル (アカウントと製品) があります。Accounts テーブルを検索し、そこから acc_id を取得し、それを使用して Products テーブルをクエリする必要があります。
Products テーブルには 10 を超える行があります。しかし、このコードを実行すると、実行するたびに 0 ~ 6 行がランダムに返されます。
コード スニペットは次のとおりです。
# Set up connection
con = mdb.connect('db.xxxxx.com', 'user', 'password', 'mydb')
# Create cursor
cur = con.cursor()
# Execute query
cur.execute("SELECT acc_id FROM Accounts WHERE ext_acc = '%s'" % account_num ) # account_num is alpha-numberic and is got from preceding part of the program
# A tuple is returned, so get the 0th item from it
acc_id = cur.fetchone()[0]
print "account_id = ", acc_id
# Close the cursor - I was not sure if I can reuse it
cur.close()
# Reopen the cursor
cur = con.cursor()
# Second query
cur.execute("SELECT * FROM Products WHERE account_id = %d" % acc_id)
keys = cur.fetchall()
print cur.rowcount # This prints incorrect row count
for key in keys: # Does not print all rows. Tried to directly print keys instead of iterating - same result :(
print key
# Closing the cursor & connection
cur.close()
con.close()
奇妙な部分は、デバッガー (Eclipse の PyDev) を使用してコードをステップスルーしようとしたところ、すべての行が正しく取得されました (変数「キー」に格納された値とコンソール出力の両方が正しい)。
MySQLコンソールで同じSQLを実行して正しい結果を得たので、DBには正しいデータがあると確信しています。
接続を不適切に閉じていないことを確認するために、接続with con
を手動で閉じる代わりに使用してみましたが、同じ結果です。
RTMを実行しましたが、この問題の解決に役立つものはあまり見つかりませんでした。
どこが間違っていますか?
ありがとうございました。
編集:私は今、別の奇妙なことに気づきました。行
cur.execute("SELECT * FROM Products WHERE account_id = %d" % acc_id)
では、acc_id 値をハードコーディングしました。つまり、それ
cur.execute("SELECT * FROM Products WHERE account_id = %d" % 322)
を作成し、すべての行を返します。