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

And*_*dré 4 python sqlite

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

\n\n

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

\n\n

它执行一次,得到满足条件的第一行并完成,我可以\xc2\xb4t弄清楚为什么它\xc2\xb4s不继续下去!有人可以帮忙吗?下面的脚本:

\n\n
# coding=utf-8\nimport urllib\nimport sqlite3\nimport json\nconn = sqlite3.connect(\'ArchDailyProjects.sqlite\')\ncur = conn.cursor()\n\n#Google Prep\nServiceUrl="https://maps.googleapis.com/maps/api/geocode/json?"\nFimDoURL="&key=????????????????????????????????" #I have the key right, this part works fine\n\n#cur.execute(\'SELECT * FROM Lugares\' )\n#print type(cur)\n#print cur\n#row=cur.fetchone()\nfor  row in cur.execute(\'SELECT * FROM LugareS\' ):\n    print \'Entramos no While\'\n    Loc_id = str(row[0])\n    Loc_Name = str(row[1])\n    Loc_Lat = row[2]\n    print Loc_Name\n    if Loc_Lat is None:\n        print Loc_Name\n        print Loc_Lat\n        print "Buscando "+Loc_Name+" no Google Maps"\n        try:\n            Url = ServiceUrl + urllib.urlencode({"sensor": "false", "address": Loc_Name}) + FimDoURL\n            Uh = urllib.urlopen(Url)\n            Dados = Uh.read()\n            try: js = json.loads(str(Dados))\n            except: js = None\n        except: continue\n        if "status" not in js or js["status"] != "OK":\n            print "===== Beeehhhh!!! N\xc3\xa3o conseguimos encontrar essa cidade===="\n            print Dados\n            continue\n        else:\n            Loc_FormatedAdress = js["results"][0]["formatted_address"]\n            Loc_Lat = js["results"][0]["geometry"]["location"]["lat"]\n            Loc_Lon = js["results"][0]["geometry"]["location"]["lng"]\n            print Dados\n        print \'Endere\xc3\xa7o Google: \', Loc_FormatedAdress\n        print \'Latitude: \', Loc_Lat\n        print \'Longitude: \', Loc_Lon\n        cur.execute(\'\'\'UPDATE Lugares SET Latitude= ?, Longitude=?, GoogleLoc=? WHERE id= ? \n        \'\'\', (Loc_Lat, Loc_Lon, Loc_FormatedAdress, Loc_id))\n        #row=cur.fetchone()\n    else: #row=cur.fetchone()\n        continue\nconn.commit()\n
Run Code Online (Sandbox Code Playgroud)\n\n

感谢你们!

\n

小智 8

如果文件很大,您可能不希望使用“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))
Run Code Online (Sandbox Code Playgroud)

工作正常。

  • 很多人说要做到这一点,使用两个光标,但你是那个_展示_如何做到这一点的人。谢谢! (2认同)

CL.*_*CL. 5

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

您正在对同一个游标对象执行不同的查询;UPDATE 没有任何结果行。

只需在循环之前读取所有数据:

cur.execute('SELECT id, Name FROM Lugares WHERE Latitude IS NULL')
empty_rows = cur.fetchall()
for row in empty_rows:
    ...
Run Code Online (Sandbox Code Playgroud)