2016-04-09 14 views
0

私は数千のアドレスを格納するMySQLテーブルを持っています。私はそれらを解析してGeolocation APIに渡し、緯度と経度を取得し、対応するアドレス行に戻す必要があります(私は特別な列を作成しました)。問題はそれを行う最も効率的な方法は何ですか?現在、私はpythonをmysql.connectorとgeopyをgeolocationsに使用しています。したがって、ジオコーディングに使用する簡単なコードは次のとおりです。MySQLテーブルの更新と更新

cursor = conn.cursor() 

cursor.execute("SELECT description FROM contacts WHERE kind = 'Home adress'") 

    row = cursor.fetchone() 
    while row is not None: 
     geocoded = geolocator.geocode(row, exactly_one=True) 
     if geocoded is not None: 
      lat = geocoded.latitude 
      lon = geocoded.longitude 
     row = cursor.fetchone() 

私はSQLデータベースにはまったく新しいものなので、助けていただければ幸いです。前もって感謝します。

+0

説明フィールドが一意でない限り、効率的にテーブルを更新できるように、テーブルの主キーが必要です。あなたは1つ持っていますか? – mhawke

+0

はい、私はkey_id列を持っています。 –

答えて

1

cursor.executemany()を使用すると、一度にテーブルを更新できます。これには、更新パラメータのリストを作成してからexecutemany()に渡す必要があります。パラメータリストは、最初のSELECTクエリの結果から作成できます。例では、私はcontactsテーブルのkey_idという名前のいくつかの主キーがあることを前提としているの下:

cursor = conn.cursor() 
cursor.execute("SELECT key_id, description FROM contacts WHERE kind = 'Home adress'") 

update_params = [] 
for key_id, description in cursor: 
    geocoded = geolocator.geocode(description, exactly_one=True) 
    if geocoded is not None: 
     lat = geocoded.latitude 
     lon = geocoded.longitude 
     update_params.append((lat, lon, key_id)) 

c.executemany("update contacts set lat = %s, lon = %s where key_id = %s", update_params) 

この上述したように、主キーが存在することを前提としています。 1つで、descriptionがテーブル内の一意のフィールドであれば、それを使用できます。 SELECTクエリからkey_idを削除し、update_paramsリストとupdateクエリの両方についてkey_idをフィールドに置き換えてください。

+0

'key_id'を主キーの列名として使用するように更新されました。 – mhawke

1

@mhavke、ありがとう!ちょうど私が必要なもの。ここに最終的に動作するコードがあります(私はいくつかの調整を行いました)。また、 '%s'を使用するのは安全ではないことに気付いていますが、これは内部使用のみのため、実際には心配していません。

cursor = conn.cursor() 
cursor.execute("SELECT key_id, description FROM contacts WHERE kind = 'Home address'") 
update_params = [] 
for key_id, description in cursor: 
    geocoded = geolocator.geocode(description, exactly_one=True) 
    if geocoded is not None: 
     lat = geocoded.latitude 
     lon = geocoded.longitude 
     update_params.append((lat, lon, key_id)) 

cursor.executemany("update contacts set latitude = %s, longitude = %s where key_id = %s", update_params) 
conn.commit() 
+0

'%s'はこの場合安全です。文字列補間ではなく、パラメータ化されたクエリです。これはmysql.connectorの正しいプレースホルダです。私が使っていた 'sqlite3'によって使用されているので、私の例では'? 'が使われています。私はそれに応じて私の答えを更新しました。 – mhawke

+0

ところで、インデントが間違っています。 – mhawke

+0

貼り付けが不正確になり、編集されました。 –