Обновление Sqlite работает неправильно - python - PullRequest
3 голосов
/ 20 января 2011

РЕДАКТИРОВАТЬ: после некоторого теста я обнаружил, что это не был метод 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

, и именно так я создал сообщение об ошибке Score 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 ]

26 голосов
/ 17 июля 2012

Хотя первоначальный автор, скорее всего, пошел дальше, я решил оставить здесь ответ для будущего Гуглера (как я ^ _ ^).

Я думаю, что здесь происходит следующая ошибка...

ValueError: parameters are of unsupported type

... фактически происходит из следующей строки (вопреки тому, что сказал автор).

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

Проблема в том, чтоCursor.execute принимает строку запроса в качестве первого параметра (который он имеет право), , но list, tuple или dict в качестве второго параметра .В этом случае ему нужно обернуть этот id в кортеж или список, например:

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

Список или кортеж можно использовать с позиционными аргументами (то есть, когда вы используете знак вопроса ? в качестве заполнителя).Вы также можете использовать dict и :key для именованных аргументов следующим образом:

s = c.execute("select score from score where id=:id", {"id": id})
2 голосов
/ 24 января 2011

У вас есть еще одна серьезная проблема с вашим кодом, если предположить, что «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 партитура"). Fetchall (), который получает все строки впереди, а не по одному за раз.

  • Используйте разные курсоры, чтобы итерация каждого из них не влияла на другие

  • Создайте новый курсор - замените c.execute ("...") на conn.cursor (). Execute ("...") Последние версии pysqlite позволяют вам делать conn.execute ("..."), который эффективно делает это выше за кулисами.

Курсоры очень дешевы, поэтому не пытайтесь их сохранять - используйте столько, сколько хотите - и у вас не будет таких ошибок.

В целом также неплохо быть очень осторожным, повторно используя итераторы и изменяя то, что вы повторяете в одной и той же серии циклов. Различные классы ведут себя по-разному, поэтому лучше предположить, что им это не нравится, если не указано иное.

2 голосов
/ 20 января 2011

В вашем последнем выборе произошла ошибка

Этот

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

должен быть записан как

s = c.execute("select score from score where id=?", id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...