2017-07-01 108 views
0

並且在嘗試弄清楚如何更新SQLite數據庫中的多行時遇到很多麻煩。循環遍歷SQL中的表並每次更新一行

有效地,我在我收集的數據庫上找到一個位置,並通過Google地圖運行以獲取經度和緯度。一般來說它的工作,但循環失敗!

它這樣做了一次,獲得符合條件並完成的第一行,我無法弄清楚它爲什麼不繼續下去!誰能幫忙?下面的腳本:

# coding=utf-8 
import urllib 
import sqlite3 
import json 
conn = sqlite3.connect('ArchDailyProjects.sqlite') 
cur = conn.cursor() 

#Google Prep 
ServiceUrl="https://maps.googleapis.com/maps/api/geocode/json?" 
FimDoURL="&key=????????????????????????????????" #I have the key right, this part works fine 

#cur.execute('SELECT * FROM Lugares') 
#print type(cur) 
#print cur 
#row=cur.fetchone() 
for row in cur.execute('SELECT * FROM LugareS'): 
    print 'Entramos no While' 
    Loc_id = str(row[0]) 
    Loc_Name = str(row[1]) 
    Loc_Lat = row[2] 
    print Loc_Name 
    if Loc_Lat is None: 
     print Loc_Name 
     print Loc_Lat 
     print "Buscando "+Loc_Name+" no Google Maps" 
     try: 
      Url = ServiceUrl + urllib.urlencode({"sensor": "false", "address": Loc_Name}) + FimDoURL 
      Uh = urllib.urlopen(Url) 
      Dados = Uh.read() 
      try: js = json.loads(str(Dados)) 
      except: js = None 
     except: continue 
     if "status" not in js or js["status"] != "OK": 
      print "===== Beeehhhh!!! Não conseguimos encontrar essa cidade====" 
      print Dados 
      continue 
     else: 
      Loc_FormatedAdress = js["results"][0]["formatted_address"] 
      Loc_Lat = js["results"][0]["geometry"]["location"]["lat"] 
      Loc_Lon = js["results"][0]["geometry"]["location"]["lng"] 
      print Dados 
     print 'Endereço Google: ', Loc_FormatedAdress 
     print 'Latitude: ', Loc_Lat 
     print 'Longitude: ', Loc_Lon 
     cur.execute('''UPDATE Lugares SET Latitude= ?, Longitude=?, GoogleLoc=? WHERE id= ? 
     ''', (Loc_Lat, Loc_Lon, Loc_FormatedAdress, Loc_id)) 
     #row=cur.fetchone() 
    else: #row=cur.fetchone() 
     continue 
conn.commit() 

謝謝你們!

+0

考慮細分數據檢索和數據更新過程分爲兩個步驟,而不是在一個循環內一舉兩得在一起。由於等待時間,連接性等原因,獲取web api數據可能會與數據庫批處理衝突。此外,可維護性更容易。 – Parfait

回答

1
for row in cur.execute('SELECT * FROM LugareS'): 
    ... 
     cur.execute('''UPDATE Lugares SET Latitude= ?, Longitude=?, GoogleLoc=? WHERE id= ? 

您正在對同一個遊標對象執行不同的查詢; UPDATE沒有任何結果行。

遍歷之前,簡單地讀取所有數據:

cur.execute('SELECT id, Name FROM Lugares WHERE Latitude IS NULL') 
empty_rows = cur.fetchall() 
for row in empty_rows: 
    ... 
+0

謝謝!完美工作,我想我理解了這個問題的概念! –

相關問題