Ошибка: вставьте ошибку команды с базой данных как SQLITE - PullRequest
0 голосов
/ 16 апреля 2020

Я вставляю данные в SQLite, используя Python

database_tasks.bookId - переменная класса

def insert(self, conn,dbname, name, writer='none'):
        c = conn.cursor()

        if dbname == "Book_database":            
            database_tasks.bookId += 1
            sql= "INSERT INTO Book_database VALUES(" + database_tasks.bookId + "," + name + "," + writer + ")"

        else:
            database_tasks.studentId += 1
            sql= "INSERT INTO Student VALUES("+ database_tasks.studentId + "," + name + ")"

        c.execute(sql)
        conn.commit()        
        return None

Я получаю сообщение об ошибке с командой Вставить.

sql= "INSERT INTO Book_database VALUES(" + database_tasks.bookId + "," + name + "," + writer + ")"

Ошибка типа: может объединять только str (не "int") в str

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

Вы должны никогда создавать строку запроса, включающую значения для вставки таким образом, но используя параметризованные запросы. Это анти-паттерн, который десятилетиями использовался для создания SQL инъекционных атак. Вы должны использовать:

    if dbname == "Book_database":            
        database_tasks.bookId += 1
        c.execute("INSERT INTO Book_database VALUES(?,?,?)",
                  (database_tasks.bookId, name, writer))

    else:
        ...
0 голосов
/ 16 апреля 2020

Ошибка довольно очевидна - вы пытаетесь объединить целое число в строку.

Я предполагаю, что database_tasks.studentId является целым числом, поэтому изменение вашего запроса на

sql= "INSERT INTO Book_database VALUES(" + str(database_tasks.bookId) + "," + name + "," + writer + ")"

исправит это, однако следует помнить, что, если оно обращено к c, оно будет очень легко использовать это, я бы рекомендовал полностью проверить ввод или изменить свой подход к этой проблеме.

0 голосов
/ 16 апреля 2020
  • похоже, что ваш bookId равен int. Приведите его к str перед объединением.
sql= "INSERT INTO Book_database VALUES(" + str(database_tasks.bookId) + "," + name + "," + writer + ")"
...