@AirronBark

Как сделать поиск по таблице SQLite3 по нескольким столбцам?

Доброго всем.

Делаю программку с помощью python tkinter для себя и конечно же я новичок в этом деле.
В БД одна таблица(пока) имеет данные в 5 столбцах(первый id). Необходимо чтобы она выдавала результаты поиска(при нажатии на кнопку) по ним, то есть пользователь вводит к примеру: имя продукта, размеры (длина/ширина/толщина).
Вот сама функция обращения к бд:
def search_records(self, product, lenght, width, thickness):
        product = ('%' + product + '%',) 
        lenght = ('%' + lenght + '%',)
        width = ('%' + width + '%',)
        thickness = ('%' + thickness + '%',)
        self.db.c.execute('''SELECT * FROM massa WHERE product LIKE ? AND lenght  LIKE ? AND  width LIKE ? AND thickness LIKE ?''', product, lenght, width, thickness)
        [self.tree.delete(i) for i in self.tree.get_children()]
        [self.tree.insert('', 'end', values=row) for row in self.db.c.fetchall()]


А здесь описана кнопка:
def init_search(self):
        self.title('Поиск')
        self.geometry ('500x300+400+300')
        self.resizable(False, False)
        label_search = tk.Label(self, text = 'Поиск по таблице')
        label_search.place(x=250,y=20)

        label_product_s = tk.Label(self, text='Наименование продукции:')
        label_product_s.place(x=50, y=80)
        self.entry_product_s = ttk.Entry(self)
        self.entry_product_s.place(x=300, y=80)

        label_lenght_s = tk.Label(self, text='Длина, мм:')
        label_lenght_s.place(x=50, y=110)
        self.entry_lenght_s = ttk.Entry(self) 
        self.entry_lenght_s.place(x=300, y=110)

        label_width_s = tk.Label(self, text='Ширина, мм:')
        label_width_s.place(x=50, y=140)
        self.entry_width_s= ttk.Entry(self) 
        self.entry_width_s.place(x=300, y=140)

        label_thickness_s = tk.Label(self, text='Толщина или высота, мм:')
        label_thickness_s.place(x=50, y=170)
        self.entry_thickness_s = ttk.Entry(self) 
        self.entry_thickness_s.place(x=300, y=170)
        btn_cansel = ttk.Button(self, text='Закрыть', command=self.destroy) 
        btn_cansel.place(x=185, y=230)
        btn_search = ttk.Button (self, text='Поиск')
        btn_search.place(x=105, y=230)
        btn_search.bind('<Button-1>', lambda event:self.view.search_records(self.entry_product_s.get(),self.entry_lenght_s.get(), self.entry_width_s.get(), self.entry_thickness_s.get()))
        btn_search.bind('<Button-1>', lambda event:self.destroy(), add='+')


А это ошибка, которая выпадает при запуске поиска:
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Program Files (x86)\Python38-32\lib\tkinter\__init__.py", line 1883, in __call__
    return self.func(*args)
  File "D:/Phyton/App_big_project/Main_app.py", line 231, in <lambda>
    btn_search.bind('<Button-1>', lambda event:self.view.search_records(self.entry_product_s.get(),self.entry_lenght_s.get(), self.entry_width_s.get(), self.entry_thickness_s.get()))
  File "D:/Phyton/App_big_project/Main_app.py", line 80, in search_records
    self.db.c.execute('''SELECT * FROM massa WHERE product LIKE  ? AND lenght  LIKE  ? AND  width LIKE  ? AND thickness LIKE ?''', product, lenght, width, thickness) 
TypeError: function takes at most 2 arguments (5 given)

Поэтому вопрос, что мне необходимо исправить в функции поиска или в кнопке, чтобы выходил нужны результат. Или это вообще не реализовать в данных библиотеках?)
  • Вопрос задан
  • 1204 просмотра
Решения вопроса 1
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
(product, length, width, thickness) передаются одним аргументом (возьмите в скобки)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@AirronBark Автор вопроса
Если будет у кого аналог ошибка: Исправил и последнюю ошибку, путем добавления str в коде: product = str ('%' + product + '%',).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы