以下是导致错误的代码。我在网上搜索了这个问题,但我找不到可以帮助我解决代码问题的来源。我使用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
答案 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通常不关心额外的空格。