我有一个MySQL表,存储了几千个地址。我需要将它们解析为地理位置API,获取纬度和经度,然后将它们放回相应的地址行(我为此创建了特殊列)。问题是最有效的方法是什么?目前我正在使用python与mysql.connector和geopy进行地理定位。因此,我使用了一个简单的代码进行地理编码:
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()
答案 0 :(得分:1)
您可以使用a:visited
一次更新表格。这需要创建一个更新参数列表,然后将其传递给cursor.executemany()
。可以从初始executemany()
查询的结果创建参数列表。在下面的示例中,我假设SELECT
表有一些名为key_id
的主键:
contacts
如上所述,这假设存在主键。如果没有,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)
是表中的唯一字段,那么您可以使用它。只需从description
查询中删除key_id
,然后将SELECT
字段替换为key_id
列表和description
查询。< / p>
答案 1 :(得分:1)
@mhavke,非常感谢!正是我需要的。这是一个最终工作的代码(我做了一些调整)。我也知道使用&#39;%s&#39;是不安全的,但这仅供内部使用,所以并不担心。
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()