2016-12-31 20 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

distance値は、forループ内の行ごとに異なっています。 updateステートメントはforループ内にあるため、distance列(すべての行)が現在の行の値に更新されるたびにwhere句がないので、どの行をupdateにするかを指定します。したがって、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はユーザーコードによって処理されていませんでした。" latitude 'が定義されていません " – Steve

関連する問題