sqlite3.ProgrammingError: Error binding parameter 1: type 'tuple' is not supported

При попытке обновления базы данных sqlite3 выводит вот такую ошибку: sqlite3.ProgrammingError: Error binding parameter 1: type 'tuple' is not supported

Вот код:

def setinventory(msgid, added):
    sql.execute("UPDATE bank SET inventory = ? WHERE id = ?", (added, msgid))

g = list(get.getsql.getinventory(msgid))
g.append(message.text[8:])
get.getsql.setinventory(msgid, tuple(g))

Ответы (1 шт):

Автор решения: gil9red

В setinventory(msgid, added) вы вызываете sql.execute, оборачивая аргументы (как added) в кортеж (tuple), чтобы был биндинг

Но при вызове setinventory вы еще раз в аргумент added передаете кортеж:

get.getsql.setinventory(msgid, tuple(g))

Передавайте как есть:

get.getsql.setinventory(msgid, g)

UPD.

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

Реализация хранения нескольких элементов в одном строковом поле:

  • Исправляем функцию getinventory - теперь она возвращает честное строковое значение
  • Придумываем формат строки для нескольких элементов, пусть это будет по разделителю ", "

Пример:

def getinventory(msgid: int) -> str:
    return sql.execute(f"SELECT inventory FROM bank WHERE id = ?", (msgid,)).fetchone()[0]

def setinventory(msgid: int, added: str):
    sql.execute("UPDATE bank SET inventory = ? WHERE id = ?", (added, msgid))

g = get.getsql.getinventory(msgid).split(", ")
g.append(message.text[8:])
get.getsql.setinventory(msgid, ", ".join(g))

Формат строки можно сделать надежнее, храня как список в json (но эта тема для другого вопроса :))

→ Ссылка