Sqlite更新无法正常工作 - python

时间:2011-01-19 21:56:02

标签: python sqlite

编辑:经过一些测试后我发现它不是失败的addpoint方法。

我正在为一个小型游戏开发一个irc机器人。这种方法将更新数据库中的得分称为“得分”,这只是两个玩家。这是一个sqlite数据库。主要是更新sql无法正常工作。

由于

def addpointo(phenny, id, msg, dude):
 try:
  for row in c.execute("select score from score where id = '0'"):
   for bow in c.execute("select score from score where id = '1'"):
    if int(row[0]) == 3:
     phenny.say("Winner is " + dude)
     clear("score") # clear db
     clear("sap") # clear db
    elif int(bow[0]) == 3:
     phenny.say("Winner is " + dude)
     clear("score") # clear db
     clear("sap") # clear db
    else:
     phenny.say(msg)
     s = c.execute("select score from score where id=?", id)
     a = int(s.fetchone()[0]) + 1
     print a
     c.execute("update score SET score =? where id =?", (a, id)) #here i got some prolem
     conn.commit()
 except Exception:
  phenny.say("Error in score. Try to run '.sap clear-score' and/or '.sap clear-sap'")
  pass

这就是我创建得分db的方式

def createscore():
 if not (checkdb("score") is True):
  c.execute('''create table score (id int, score int)''')
  c.execute('insert into score values (0, 0)')
  conn.commit()
  c.execute('insert into score values (1, 0)')
  conn.commit()

错误消息:参数属于不受支持的类型

3 个答案:

答案 0 :(得分:26)

虽然原作者最有可能继续前进,但我想我会在这里为未来的Google员工留下答案(就像我^ _ ^)。

我认为这里发生的是以下错误......

ValueError: parameters are of unsupported type

......实际上来自以下行(与作者所说的相反)。

s = c.execute("select score from score where id=?", id)

这里的问题是Cursor.execute接受查询字符串作为第一个参数(他有权),但是listtuple或{{1} }作为第二个参数。在这种情况下,他需要将dict包装在元组或列表中,如下所示:

id

列表或元组可以与位置参数一起使用(当您使用问号s = c.execute("select score from score where id=?", (id,)) 作为占位符时)。您还可以使用?dict作为命名参数,如下所示:

:key

答案 1 :(得分:2)

您上次选择

时出错

这个

s = c.execute("select score from score where id='id'")

必须写成

s = c.execute("select score from score where id=?", id)

答案 2 :(得分:2)

假设'c'是游标,您的代码还有另一个严重问题。 SQLite游标一次获得一个下一个结果行(即每次通过for循环),而不是提前全部。如果重用游标,则它会用新的查询替换当前查询。例如,此代码只会在循环中运行一次:

for row in c.execute("select * from score"):
   for dummy in c.execute("select 3"):
      print row, dummy

您的解决方案包括:

  • 在结尾处添加.fetchall():c.execute(“select * from score”)。fetchall()获取前面的所有行而不是一次获取所有行。

  • 使用不同的游标,因此每个游标的迭代不会影响其他游标

  • 创建一个新游标 - 用conn.cursor()替换c.execute(“...”)。execute(“...”) pysqlite的最新版本允许你做conn.execute(“...”),它在幕后有效地做到了这一点。

游标非常便宜,所以不要试图保存它们 - 尽可能多地使用它们 - 你就不会有这样的错误。

一般来说,重新使用迭代器并修改在同一系列循环中迭代的内容也是一个好主意。各种类的行为方式各不相同,所以除非另有说明,否则最好假设它们不喜欢它。