为什么我得到的对象不可迭代'错误?

时间:2017-09-21 01:46:38

标签: python mysql types

以下是导致错误的代码。我在网上搜索了这个问题,但我找不到可以帮助我解决代码问题的来源。我使用python来执行SQL命令,但问题在于python。我不明白为什么代码试图迭代变量'

while True:
    x = 1
    #states = api.get_states()
    for s in states.states:
        cursor.execute("UPDATE aircraft SET latitude = %s, longitude = %s, velocity = %s, heading = %s, callsign = %s", ( getLat(s), getLon(s), getVel(s), getHeading(s), getCallsign(s)))
        cursor.execute("WHERE entry = %r;",x)  #this line is causing the error
        x += 1
    y = input("Database updated, enter 1 to update again or enter 0 to exit ")
    if (y == 1):
        continue
    elif (y == 0):
        print("Exiting program...")
        break

1 个答案:

答案 0 :(得分:1)

假设您使用的是MySQL DBAPI 2.0兼容软件包,此处的代码存在两个问题。

首先,DBAPI 2.0指定将查询参数作为可迭代或映射提供。将值x放在元组或列表中可以解决该问题。

    cursor.execute("UPDATE aircraft SET latitude = %s, longitude = %s, velocity = %s, heading = %s, callsign = %s", ( getLat(s), getLon(s), getVel(s), getHeading(s), getCallsign(s)))
    cursor.execute("WHERE entry = %r;", tuple(x)) # [x] would also be valid.

此外,整个声明需要成为对cursor.execute的一次调用的一部分。 WHERE entry = 1不是完整的SQL语句。

来源: PEP 249 - DBAPI 2.0 Specification

编辑:显示我将如何在单个执行调用中编写查询。

    cursor.execute("""
        UPDATE aircraft
        SET latitude = %s, longitude = %s, velocity = %s, heading = %s, callsign = %s
        WHERE entry = %r
      """,
      (getLat(s), getLon(s), getVel(s), getHeading(s), getCallsign(s), x)
    )

多行字符串实现了我认为操作与staement拆分的效果,并且SQL通常不关心额外的空格。