Как вызвать динамический MYSQL-запрос в Python, выбрав элемент из OptionMenu? - PullRequest
0 голосов
/ 05 июля 2019

Я попытался, выбрав один из вариантов в OptionMenu, чтобы вызвать конкретный запрос MYSQL для заполнения дерева!Когда приложение запускается в первый раз, все в порядке, оно все вытягивает, передает переменные для построения запроса:

SELECT * FROM awp where awp.Order > 1 and awp.date > "1900-01-01" and awp.markerid like "%" Затем оно должно передавать новые переменные, когда я выбираю что-то из OptionMenu.Это происходит, например, как запрос:

SELECT * FROM awp where awp.Order > 1 and awp.date = "2004-01-20" and awp.markerid like "%"

или:

SELECT * FROM awp where awp.Order = 140526 and awp.date > "1900-01-01" and awp.markerid like "MARK_X4"

после выбора некоторых элементов из OptionMenus, ноTreeview не заполняется новым запросом, и он получает все из базы данных MYSQL!

Это мое первое приложение на python, так что кроме попыток изменить, когда вызывается функция, как форматируются переменные (у меня были проблемы с форматированием даты) Я не знал, что еще попробовать.Шаг за шагом я вижу, что запрос обновляется, но не выполняется дальше, и дерево не заполняется соответствующим образом.

    def db_refreshPLAN(self,forder, fdate, fmarker):
        if fdate.get() == 'All':
            querydate = '1900-01-01'
            dateoperator = '>'
        else:
            querydate = fdate.get()
            dateoperator = '='
        if fmarker.get() == 'All':
            querymarker = '%'
        else:
            querymarker = fmarker.get()
        if forder.get() == 'All':
            queryorder = str(1)
            orderoperator = '>'
        else:
            queryorder = forder.get()
            orderoperator = '='
        dbAWP = mdb.connect("localhost", port=3306, user="root", passwd="Ceres", db="sqltest1")
        cursor = dbAWP.cursor()
        strquery = str('SELECT * FROM awp where awp.Order ' + orderoperator +
                       ' ' + queryorder + ' and awp.date ' + dateoperator +
                       ' "' + querydate + '" and awp.markerid like "' + querymarker + '"')
        print(strquery)
        cursor.execute(strquery)
        dbAWP.commit()
        rows = cursor.fetchall()
        cpt = 0
        for row in rows:
            self.treeplan.insert('', 'end', text=str(cpt), values=(row[1], row[2], row[3], row[4], row[5], row[6],
                                                               row[7], row[8], row[9], row[10], row[11], row[12],
                                                               row[13], row[14]))
            cpt += 1

Я хотел отфильтровать объект Treeview, выполняя новый запрос SQL каждый раз, когда один из элементов OptionMenuвыбран.

1 Ответ

0 голосов
/ 05 июля 2019

Хорошо, извините, что потратил время. Я нашел ответ сам, просто «очистив» весь Treeview, прежде чем «заполнить» его результатами нового запроса!

Цикл фактически пытался добавить «отфильтрованные» результаты в уже заполненное древовидное представление вместо создания совершенно нового отфильтрованного списка!

Итак ...

for i in self.treeplan.get_children():
    self.treeplan.delete(i)
...