循环遍历SQL中的表并每次更新一行

时间:2017-07-01 19:33:19

标签: python sqlite

并且在尝试弄清楚如何更新SQLite数据库中的多行时遇到了很多麻烦。

有效地,我在我收集的数据库上获得了一个位置,并通过谷歌地图运行以获得纬度和经度。一般来说它的工作,但循环失败!

它做了一次,得到满足标准并完成的第一行,我无法弄清楚为什么它不继续!有人可以帮忙吗?以下脚本:

# 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()

谢谢你们!

2 个答案:

答案 0 :(得分:3)

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:
    ...

答案 1 :(得分:1)

如果文件很大,您可能不希望使用" fetchall"将整个数据库加载到内存中。但一次只读一行,并随时更新条目。您可以通过创建两个游标来完成此操作。

import sqlite3 as sq3
conn = sq3.connect(db_name)
cur = conn.cursor()
cur2 = conn.cursor()

for row in cur.execute('SELECT * FROM Table' ):
    cur2.execute('''UPDATE Table SET variable = ? WHERE id= ?''', (variable, id))

工作正常。