TypeError: simple_query () принимает 2 позиционных аргумента, но 3 было дано - PullRequest
0 голосов
/ 06 января 2020

Код:

from tkinter import *
import tkinter as tk
import mysql.connector

def main():
    root = tk.Tk()
    app = MainWindow(root)
    root.mainloop()

class mySQL:
    def __init__(self):
        #MySQL Credentials
        self.db = mysql.connector.connect(
        host="XXXX-XX99",
        user="root",
        passwd="TEST",
        database="technical")
        #Cursor
        self.cursor = self.db.cursor()

    def simple_query(self,sql):
        self.cursor.execute(sql)


class MainWindow:
    def __init__(self,master):
        self.master = master
        self.master.state('zoomed')
        self.master.geometry('400x700')
        self.frame = Frame(self.master)
        self.frame.pack(fill="both", expand=True)
        #Entries and text-box
        self.nameLabel = Label(self.frame, text = "Name of Person Making Request:")
        self.nameEntry = Entry(self.frame)
        # Buttons
        self.btn = Button(self.frame, text = "Submit", command = self.sendData)
        # Organizing above^
        self.nameLabel.pack()
        self.nameEntry.pack()
        self.btn.pack()

    def sendData(self):
        x = mySQL()

        #Values
        values = (
        self.nameEntry.get(),
        )

        #Insert Command
        x.simple_query("INSERT INTO document_control (person) values ('%s')", values)


if __name__ == '__main__':
    main()

Цель:

Внутри моего класса mySQL и функция simple_query(self,sql) используется в моем классе MainWindow при функции sendData(self). (см. x.query("INSERT...") Я пытаюсь заставить эту работу просто вставить значения в MySQL.

Когда я нажимаю кнопку submit - (активирует функцию sendData(self)), появляется ошибка:

TypeError: simple_query() takes 2 positional arguments but 3 were given

Я не совсем уверен, почему вывод - TypeError.

Где я тут ошибаюсь? Какой раздел кода мне нужно изменить? А что нужно менять?

Ответы [ 2 ]

2 голосов
/ 06 января 2020
def simple_query(self, sql):
     self.cursor.execute(sql)

и

x.simple_query("INSERT INTO document_control (person) values ('%s')", values)

Здесь вы передаете 2 аргумента simple_query (строка запроса и values), но он принимает только один, sql (self - это например, x, и передается неявно).


Другие ответы делают ваш код работоспособным, но также делают его уязвимым для SQL инъекции .

Например, если кто-то введет строку a'); delete from document_control; -- в GUI, тогда выполненный запрос будет

INSERT INTO document_control (person) values ('a'); delete from document_control; -- ')

Не очень хорошо ...


Вместо использования строковой интерполяции вы должны использовать параметризованный запрос. Это можно сделать, разрешив simple_query принять необязательный кортеж arguments.

def simple_query(self, sql, args=None):
    if not args:
        self.cursor.execute(sql)
    else:
        self.cursor.execute(sql, args)

Имейте в виду, что args должен быть кортежем или списком.

1 голос
/ 06 января 2020

используйте команду

x.simple_query("INSERT INTO document_control (person) values ('%s')" %values)

Я тестировал как

class Test():

    def simple_query(self, message):
        print(message)


x = Test()
values = 'asasda'
x.simple_query("INSERT INTO document_control (person) values ('%s')" %values)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...