1. ホーム
  2. python

[解決済み】Python MySQLコネクタ - fetchoneを使用すると未読の結果が見つかる

2022-02-22 08:44:18

質問

MySQLデータベースにJSONデータを挿入しています。

JSONをパースして、Pythonコネクタを使ってMySQL dbに挿入しているところです。

試行錯誤の結果、このコードにエラーがあることがわかりました。

for steps in result['routes'][0]['legs'][0]['steps']:
    query = ('SELECT leg_no FROM leg_data WHERE travel_mode = %s AND Orig_lat = %s AND Orig_lng = %s AND Dest_lat = %s AND Dest_lng = %s AND time_stamp = %s')
    if steps['travel_mode'] == "pub_tran":
        travel_mode = steps['travel_mode']
        Orig_lat = steps['var_1']['dep']['lat']
        Orig_lng = steps['var_1']['dep']['lng']
        Dest_lat = steps['var_1']['arr']['lat']
        Dest_lng = steps['var_1']['arr']['lng']
        time_stamp = leg['_sent_time_stamp'] 
    if steps['travel_mode'] =="a_pied":
        query = ('SELECT leg_no FROM leg_data WHERE travel_mode = %s AND Orig_lat = %s AND Orig_lng = %s AND Dest_lat = %s AND Dest_lng = %s AND time_stamp = %s')
        travel_mode = steps['travel_mode']
        Orig_lat = steps['var_2']['lat']
        Orig_lng = steps['var_2']['lng']
        Dest_lat = steps['var_2']['lat']
        Dest_lng = steps['var_2']['lng']
        time_stamp = leg['_sent_time_stamp']
    cursor.execute(query,(travel_mode, Orig_lat, Orig_lng, Dest_lat, Dest_lng, time_stamp))
    leg_no = cursor.fetchone()[0]
    print(leg_no)

上位レベルの詳細を挿入し、この下位レベルの情報をその親と関連付けるために、データベースを検索しているところです。この一意の値を見つける唯一の方法は、出発地と目的地の座標とタイムスタンプを使用して検索することです。このロジックは正しいと思いますし、このセクションの直後にleg_noを印刷することで、一見して正しいように見える値を見ることができます。

しかし、残りのコードに追加すると、カーソルを使用してより多くのデータを挿入する後続のセクションで、このエラーで失敗します - 。

    raise errors.InternalError("Unread result found.")
mysql.connector.errors.InternalError: Unread result found.

と似たような問題だと思われます。 Pythonを使ったMySQLの未読結果

クエリが複雑すぎて分割が必要なのか、それとも別の問題があるのでしょうか?

クエリが複雑すぎる場合、どのように分割するのがベストなのか、どなたかアドバイスをお願いします。

EDIT @Gordのヘルプに従って、未読の結果をダンプするようにしました。

cursor.execute(query,(leg_travel_mode, leg_Orig_lat, leg_Orig_lng, leg_Dest_lat, leg_Dest_lng))
            leg_no = cursor.fetchone()[0]
            try:
                cursor.fetchall()
            except mysql.connector.errors.InterfaceError as ie:
                if ie.msg == 'No result set to fetch from.':
                    pass
                else:
                    raise
            cursor.execute(query,(leg_travel_mode, leg_Orig_lat, leg_Orig_lng, leg_Dest_lat, leg_Dest_lng, time_stamp))

しかし、まだ

raise errors.InternalError("Unread result found.")
mysql.connector.errors.InternalError: Unread result found.
[Finished in 3.3s with exit code 1]

頭を掻く

EDIT 2 - ie.msgを印刷すると、-が表示されます。

No result set to fetch from

解決方法は?

必要なのは buffered を true に設定する必要があります!

cursor = cnx.cursor(buffered=True)

つまり、"fetchone"は実際には問い合わせの全結果セットから1行しか取り出さないということです。同じカーソルを再度使用する場合、フェッチ待ちの結果がまだn-1個(nは結果集合の量)あることを訴えます。しかし、バッファードカーソルを使用すると、コネクタは裏ですべての行をフェッチし、あなたはコネクタから1行を取得するだけなので、mysql dbから文句を言われることはないでしょう。