并且在尝试弄清楚如何更新 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()\nRun 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)
工作正常。
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)
| 归档时间: |
|
| 查看次数: |
11219 次 |
| 最近记录: |