从mysql-connector fetchall更新结果

时间:2019-03-23 19:01:25

标签: python mysql-connector

我正在尝试从civicrm_address表中选择某些记录并更新地址解析列。我使用fetchall来检索行,然后在同一循环中,尝试使用geocoder API的结果进行更新,并在update_sql语句中传递civicrm_address.id值。

尝试更新和提交后的行数始终为-1,因此我认为由于某些原因它失败了,但我仍未弄清原因。

import geocoder
import mysql.connector

mydb = mysql.connector.connect(
  [redacted]
)


mycursor = mydb.cursor(dictionary=True)
update_cursor = mydb.cursor()

sql = """

    select
        a.id
        , street_address
        , city
        , abbreviation
    from
        civicrm_address a
        , civicrm_state_province b
    where
        location_type_id = 6
    and
        a.state_province_id = b.id
    and
        street_address is not null
    and
        city is not null
    limit 5

"""
mycursor.execute(sql)
rows = mycursor.fetchall()
print(mycursor.rowcount, "records selected")

for row in rows:
    address_id = int(row["id"])
    street_address = str(row["street_address"])
    city = str(row["city"])
    state = str(row["abbreviation"])

    myaddress = street_address + " " + city + ", " + state

    g = geocoder.arcgis(myaddress)
    d = g.json

    latitude = d["lat"]
    longitude = d["lng"]

    update_sql = """
    begin work;
    update
        civicrm_address
    set
        geo_code_1 = %s
        , geo_code_2 = %s
    where
        id = %s
    """
    var=(latitude, longitude, address_id)
    print(var)
    update_cursor.execute(update_sql, var, multi=True)
    mydb.commit()
    print(update_cursor.rowcount)

mycursor.close()
update_cursor.close()
mydb.close()

这是一个更简单的脚本

我已经直接在MySQL工作台中执行了update_sql语句,它成功了。它不适用于Python。

import geocoder
import mysql.connector

try:
    mydb = mysql.connector.connect(
[redacted]
    )

    mycursor = mydb.cursor(dictionary=True)
    update_cursor = mydb.cursor()

    update_sql = """
    begin work;
    update
        civicrm_address
    set
        geo_code_1 = 37.3445
        , geo_code_2 = -118.5366074
    where
        id = 65450;
    """
    update_cursor.execute(update_sql, multi=True)
    mydb.commit()
    print(update_cursor.rowcount, "row(s) were updated")

except mysql.connector.Error as error:
    print("Failed to update record to database: {}".format(error))
    mydb.rollback()

finally:
    # closing database connection.
    if (mydb.is_connected()):
        mydb.close()

1 个答案:

答案 0 :(得分:0)

我现在正在工作。我确实删除了“开始工作”语句,但没有删除multi = True,它不起作用。后来我删除了multi = True语句,它起作用了。