2016-12-31 51 views
0

我試圖計算座標對之間的距離,並用結果更新表列。在SQL語句中包含變量的問題 - 在Python 3.4中

當我打印循環結果時(見截圖),每對座標之間距離的計算工作正常。

但是,添加到表格的距離存在問題(請參見截圖) - 所有行的距離爲15886,點(-36.8090839,174.718904)和(0,0)之間的距離。

看來我的問題是如何構建我的UPDATE命令 - 特別是從表格中獲取座標(lat和long)的變量。

有人能指出我做錯了什麼嗎?

我是新來的蟒蛇。

enter image description here

import _sqlite3, time, datetime, gpxpy.geo 
conn = _sqlite3.connect('SpatialDB') 
c = conn.cursor() 

lat1 = -36.8090839 
lon1 = 174.718904 

c.execute('Select * FROM Media') 
data = c.fetchall() 
for row in data: 
    lat2 = row[1] 
    lon2 = row[2] 
    dist = gpxpy.geo.haversine_distance(lat1, lon1, lat2, lon2)/1000 
    SQLCommand =("UPDATE Media SET LastQueried = Current_Timestamp, Distance = ?"); 
    value = [dist] 
    c.execute(SQLCommand, value) 
    print(dist) 

conn.commit() 
c.close() 
conn.close() 
+3

沒有WHERE子句,UPDATE會將所有行設置爲相同的值。參見[Wikipedia](https://en.wikipedia.org/wiki/Update_%28SQL%29)(文章的最後)。 – BrenBarn

+0

另外,'conn.commit()'可能需要在循環內,否則只有最後一個'c.execute()'被提交。 – Parfait

回答

1

distance值是用於在for循環每行的不同。因爲update語句在for循環,因爲沒有where子句指定行update每次distance列(所有行)被更新爲當前行的值。因此,您在distance列(距for循環的距離的最後一個值)中看到相同的值。

假設business對每一行都是唯一的,則將其用作where子句,以便相應的行得到更新。

import _sqlite3, time, datetime, gpxpy.geo 
conn = _sqlite3.connect('SpatialDB') 
c = conn.cursor() 

lat1 = -36.8090839 
lon1 = 174.718904 

c.execute('Select * FROM Media') 
data = c.fetchall() 
for row in data: 
    lat2 = row[1] 
    lon2 = row[2] 
    busns= row[0] 
    dist = gpxpy.geo.haversine_distance(lat1, lon1, lat2, lon2)/1000 
    c.execute("UPDATE Media SET LastQueried = ?, Distance = ? WHERE Business = ?",(Current_Timestamp,dist,busns)) 

conn.commit() 
c.close() 
conn.close() 
+0

謝謝,這是有道理的 - 但現在我得到以下錯誤「操作錯誤未處理的用戶代碼」..在「(」:語法錯誤。搜索這個錯誤,它出現可能有一系列原因(強制轉換,語法問題。 ..等等)其中沒有一個我可以馬上看到在建議的代碼中 – Steve

+0

你可以嘗試編輯嗎? –

+0

這次「NameError是未處理的用戶代碼..名稱'緯度'未定義」 – Steve