Skip to main content
 首页 » 编程设计

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

2025年05月04日23落叶

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

实际上,我在我收集的数据库中获取了一个位置,并通过 Google map 运行以获取纬度和经度。总的来说它可以工作,但是循环失败了!

它只执行一次,获取满足条件的第一行并完成,但我不明白为什么它不继续运行!!谁能帮忙?下面的脚本:

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

谢谢大家!

请您参考如下方法:

如果文件很大,您可能不想使用“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)) 

工作正常。