2015-04-21 11 views
17

Ben MySQL veritabanıPython MySQL konektörü - fetchone

Ben piton konektörü deneme yoluyla

kullanarak db bir MySQL takarak sonra JSON ayrıştırma ve am içine JSON veri ekleme am kullanırken bulunan okunmamış sonuç, Ben hata Ben üst düzey ayrıntıları takılı ve şimdi onun ebeveyni ile bu alt düzey bilgileri ilişkilendirmek için veritabanını arıyorum kod

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) 

bu parça ile ilişkilidir görebilirsiniz. Bu benzersiz değeri bulmanın tek yolu, time_stamp ile kaynak ve hedef koordinatları üzerinden arama yapmaktır. Mantığın sağlam olduğunu ve bu bölümün hemen ardından leg_no'yu basarak, ilk incelemede görünen değerlerin doğru olması için

'u görebiliyorum. Ancak, kodun geri kalanına eklendiğinde, daha fazla veriye neden olan bölümlere neden oluyor. sorun sorgu çok karmaşık mı MySQL Unread Result with Python

benzemekte ve bölme ihtiyacı ya da başka bir sorun olduğunu

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

- bu hata ile başarısız olmasına imleci kullanarak yerleştirilir?

Sorgu gerçekten çok karmaşıksa, bunu nasıl en iyi şekilde bölüştürebilir? @ Gord yardımıyla gereğince

DÜZENLEME Ive hala çizikler

EDIT 2 baş

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

olsun, herhangi bir okunmamış sonuçları
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)) 

dökümü çalıştı Ama - ne zaman ie.msg yazdı, aldım -

No result set to fetch from 
+0

Sonuç kümesinin üzerinden dönüyor ve veritabanını yeniden sorgulamak için sonucu kullanıyor musunuz? Bunun için aynı imleci kullanıyor musunuz? İlk önce tamponlu imleci kullanmak muhtemelen iyidir. Gord'un cevabına eklemek için fazla bir şeyim yok. – geertjanvdk

cevap

41

Tüm bu gerekli arabellek için doğru olarak ayarlanmış oldu!

cursor = cnx.cursor(buffered=True) 
+1

Çok teşekkür ederim, potansiyel hata arama saatlerini kurtardınız. Ve neden bu işe yaradı, açıklama nedir? – Humoyun

+0

Beni de koru. Bunun neden işe yaradığını anlamaktan da memnun olurum. Teşekkürler! – Som

+7

Bunun nedeni, arabelleğe alınmış bir imleç olmadan, sonuçların "tembel" olduğunu, yani "fetchone" ifadesinin aslında sorgudaki tam sonuç kümesinden yalnızca bir satırı almasıdır. Aynı imleci tekrar kullanacağınız zaman, alınmayı bekleyen n-1 sonuçlarının (n'nin sonuç kümesi miktarı) olduğunu şikayet edecektir. Ancak, bir tamponlanmış imleci kullandığınızda, bağlayıcı sahnelerin arkasındaki TÜM satırları getirir ve mysql db'nin şikayet etmeyeceği şekilde bağlayıcıdan bir tane alırsınız. Umarım yardımcı olur. – ilaif

11

Sorununuzu yeniden oluşturabiliyordum. MySQL Bağlayıcısı/Python, birden çok satır alırsanız ve imleci kapatmadan veya bunları başka bir şey almak için kullanmadan önce hepsini almazsanız, onu beğenmez. Örneğin

import mysql.connector 
cnxn = mysql.connector.connect(
    host='127.0.0.1', 
     user='root', 
     password='whatever', 
     database='mydb') 
crsr = cnxn.cursor() 
crsr.execute("DROP TABLE IF EXISTS pytest") 
crsr.execute(""" 
CREATE TABLE pytest (
    id INT(11) NOT NULL AUTO_INCREMENT, 
    firstname VARCHAR(20), 
    PRIMARY KEY (id) 
    ) 
""") 
crsr.execute("INSERT INTO pytest (firstname) VALUES ('Gord')") 
crsr.execute("INSERT INTO pytest (firstname) VALUES ('Anne')") 
cnxn.commit() 
crsr.execute("SELECT firstname FROM pytest") 
fname = crsr.fetchone()[0] 
print(fname) 
crsr.execute("SELECT firstname FROM pytest") # InternalError: Unread result found. 

sadece beklemek (veya umurumda) bir satır o zaman sorgudan

crsr.execute("SELECT firstname FROM pytest LIMIT 0, 1") 
fname = crsr.fetchone()[0] 
print(fname) 
crsr.execute("SELECT firstname FROM pytest") # OK now 

bir LIMIT koyabilirsiniz ya da herhangi okunmamış sonuçların kurtulmak için fetchall() kullanabilirsek aldığınız satırlarla çalışmayı bitirdikten sonra.

crsr.execute("SELECT firstname FROM pytest") 
fname = crsr.fetchone()[0] 
print(fname) 
try: 
    crsr.fetchall() # fetch (and discard) remaining rows 
except mysql.connector.errors.InterfaceError as ie: 
    if ie.msg == 'No result set to fetch from.': 
     # no problem, we were just at the end of the result set 
     pass 
    else: 
     raise 
crsr.execute("SELECT firstname FROM pytest") # OK now 
+0

Zaman ayırın @Gord! İlginç.Yani, bir satırdan daha fazlasına dikkat ediyorum ve bu yüzden sorgudaki bir sınır işe yaramayacak. Fetchall yöntemini deniyorum. Ancak, tam olarak aynı hatayı alıyorum: s. Bunu cevaplamak için cevabımı düzenledim. Herhangi bir fikir? Tekrar teşekkürler, Gerry – LearningSlowly

+0

"fetchall()" herhangi bir okunmamış sonuçtan kurtulmak için "çok yardımcı oldu. –

İlgili konular