通过MySQL表迭代并更新

时间:2016-04-09 07:01:37

标签: python mysql

我有一个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()

2 个答案:

答案 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()