2016-12-31 1 views
0

좌표 쌍 간의 거리를 계산하고 결과로 테이블 열을 업데이트하려고합니다.SQL 문에 변수 포함 문제 - Python 3.4

루프에서 결과를 인쇄 할 때 각 좌표 쌍 사이의 거리 계산이 잘 작동합니다 (스크린 샷 참조).

그러나 표에 추가 된 거리에 문제가 있습니다 (스크린 샷 참조) - 모든 행의 거리는 15886이고 점 사이의 거리 (-36.8090839, 174.718904)와 (0,0)입니다.

나타납니다. 내 UPDATE 명령이 생성되는 방식에 문제가 있습니다. 구체적으로 테이블에서 제공된 좌표 (위도와 경도)에 대한 변수를 추가하는 것과 관련이 있습니다.

누군가 내가 잘못하고있는 것을 지적 할 수 있습니까?

저는 python을 처음 사용합니다.

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

distancefor 루프의 각 행에 대해 다르다. update 문은 for 루프에 있기 때문에 distance 열 (모든 행)은 where 절이 없으므로 현재 행의 값으로 업데이트되어 update으로 지정됩니다. 따라서 distance 열에있는 동일한 값 (for 루프에서 마지막 거리 값)을 볼 수 있습니다.

이 각 행에 대해 고유하다고 가정하면 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가 사용자 코드에 의해 처리되지 않았습니다 ... 'latitude'가 정의되지 않았습니다." – Steve