Python 遍历MySQL表并更新

Python 遍历MySQL表并更新,python,mysql,Python,Mysql,我有一个MySQL表,它存储了几千个地址。我需要将它们解析为地理定位API,获取纬度和经度,然后将它们放回相应的地址行(我为此制作了特殊列)。问题是什么是最有效的方法?目前,我正在将python与mysql.connector和geopy一起用于地理位置。因此,我使用一个简单的代码进行地理编码: cursor = conn.cursor() cursor.execute("SELECT description FROM contacts WHERE kind = 'Home adress'")

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

您可以使用
cursor.executemany()
一次性更新表。这需要创建更新参数列表,然后将其传递给
executemany()
。可以根据初始
SELECT
查询的结果创建参数列表。在下面的示例中,我假设有一些名为
key\u 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)

如上所述,这假设存在主键。如果表中没有一个字段且
说明
是唯一字段,则可以使用该字段。只需从
SELECT
查询中删除
key\u id
,并将
key\u id
替换为
description
字段,用于
update\u params
列表和
update
查询。

您可以使用
cursor.executemany()
一次更新表。这需要创建更新参数列表,然后将其传递给
executemany()
。可以根据初始
SELECT
查询的结果创建参数列表。在下面的示例中,我假设有一些名为
key\u 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)

如上所述,这假设存在主键。如果表中没有一个字段且
说明
是唯一字段,则可以使用该字段。只需从
选择
查询中删除
key\u id
,并将
key\u id
替换为
description
字段,用于
update\u params
列表和
update
查询。

@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()

@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()

除非description字段是唯一的,否则您需要表的主键,以便高效地更新表。您有吗?是的,我有key\u id列。除非description字段是唯一的,否则您需要表的主键,以便高效地更新表。您有吗?是的,我有key\u id列。更新为使用
key\u id
作为主键列名。更新为使用
key\u id
作为主键列名。
%s
在这种情况下是安全的-它不是字符串插值,而是参数化查询。这是mysql.connector的正确占位符-我的示例使用了
,因为我测试的
sqlite3
使用了这个占位符。我已经相应地更新了我的答案。
%s
在这种情况下是安全的-它不是字符串插值,而是参数化查询。这是mysql.connector的正确占位符-我的示例使用了
,因为我测试的
sqlite3
使用了这个占位符。我已经相应地更新了我的答案。