Как из из бд удалить строку через pyqt

Рейтинг: 0Ответов: 2Опубликовано: 04.04.2023

Допустим у меня есть QlineEdit и при нажатии кнопки я хочу удалять все строки которые с ним совпадают.

    def delete(self):
        self.connection = mysql.connector.connect(**dbconfig)
        self.cursor = self.connection.cursor()
        self.cursor.execute("CREATE DATABASE IF NOT EXISTS testdb")
        self.cursor.execute("USE testdb")
        self.cursor.execute("CREATE TABLE IF NOT EXISTS test (id INT PRIMARY KEY AUTO_INCREMENT, col2 VARCHAR(45))")
        if self.lineEdit.text() != "":
            text = self.lineEdit.text()
            print(text)
            self.cursor.execute("DELETE FROM test WHERE col2 = text")
        print("success")

Появляется ошибка -1073740791 (0xC0000409), хотя согласно документации, sql запрос выполнен правильно. Предполагаю, что проблема может быть в разнице типов данных, но как исправить это не знаю.

Ответы

▲ 0Принят

Короче ответ оказался вообще не очевидным. Я и вправду забыл внести изменения через self.connection.commit(), но итоговая строка с запросом выглядит так.

self.cursor.execute("DELETE FROM test WHERE col2 = '{}'".format(text))

Я нигде не находил до этого такой синтаксис до этого. Из объяснения моего знакомого я мало что понял, однако это что-то в духе self.cursor.execute не имеет своего собственного форматирования, поэтому он воспринимает sql запрос и сравнение с параметром как 2 отдельных сообщения. Был бы признателен, если у кого есть литература почему так.

▲ 1

Вот этот код ошибки -1073740791 (0xC0000409) вообще не несёт полезной информации0, к сожалению.

Предположу, что в вашем случае это может быть ошибка в заросе удаления строк из таблицы. Вы используете просто текст без кавычек. Текстовые значения в запросах должны бтаться в кавычки, в противном случае, БД будет пытаться сравнить колонку col2 с колонкой text (которого не существует в вашей таблице), вместо того чтобы искать строки значение в колонке col2 которых равняется слову text.

self.cursor.execute("DELETE FROM test WHERE col2 = text")
#--------------------------------------------------^^^^
#Должно быть так:
self.cursor.execute("DELETE FROM test WHERE col2 = 'text'")

В вашем же случае, как я понимаю, вы хотите удалить из таблицы БД строки значение col2 которых соответствует значению в переменной text. В этом случае, вам нужно писать так:

self.cursor.execute("DELETE FROM test WHERE col2 = %s", (text,))

И не забывайте делать self.connection.commit() после запросов вносящих изменения в БД, иначе эти изменения не будут применены.