只从mysql获取最后一个值

时间:2014-12-26 12:52:22

标签: python mysql tkinter

我有一个代码,需要在数据库中显示与输入框中输入的数据相同的值的标签。但是我只得到显示的标签的最后一个值而不是第一个值。

数据库:

a1 bike  
a2 car    

问题:如果我输入a1,自行车没有显示..但是当输入a2时我开车。

编码:

import Tkinter as tki
import MySQLdb
db = MySQLdb.connect(host="localhost", # your host, usually localhost
                         user="root", # your username
                          passwd="mysql", # your password
                          db="sakila") # name of the data base
cursor = db.cursor()

    # execute SQL select statement
cursor.execute("SELECT A1,A2 FROM adarsh1")
keywords1=[]
for i in cursor.fetchall():
    keywords1.append(i[0])
    keywords1.append(i[1])

class App(object):
     def __init__(self,root):
         self.root = root

         self.txt_frm = tki.Frame(self.root, width=900, height=900)
         self.txt_frm.pack(fill="both", expand=True)
         button3 = tki.Button(self.txt_frm,text="CLICK 1", command = self.retrieve_inpu)
         button3.grid(column=0,row=2)
         self.entry = tki.Entry(self.txt_frm)
         self.entry.grid(column=1,row=0)

         #create label in init
         self.label = tki.Label(self.txt_frm)
         self.label.grid(column=0,row=3)

     def retrieve_inpu(self):
        ent = self.entry.get()

        if ent in i[0]:   
            self.label['text'] = i[1]


root = tki.Tk()
app = App(root)
root.mainloop()

1 个答案:

答案 0 :(得分:3)

在构建i时,您使用keywords1作为循环变量:

for i in cursor.fetchall():
    keywords1.append(i[0])
    keywords1.append(i[1])

i永远不会被清除,它仍然绑定到数据库的最后一行。

然后重新使用该全局名称:

def retrieve_inpu(self):
    ent = self.entry.get()

    if ent in i[0]:   
        self.label['text'] = i[1]

由于i仍设置为['a2', 'car'],如果if设置为ent之一'a2',则上述'a'语句才会成立1}},或'2'

您可以使用词典

keywords1 = {}
for row in cursor.fetchall():
    keywords1[row[0]] = row[1]

现在您要将值从第一列映射到第二列。在retrieve_inpu函数中,如果密钥存在,您现在只需查找值:

def retrieve_inpu(self):
    ent = self.entry.get()

    if ent in keywords1:   
        self.label['text'] = keywords1[ent]

这只会匹配整个单词,所以只有'a2''a1'会这样做。

最好的方法是向数据库询问匹配:

def retrieve_inpu(self):
    ent = self.entry.get()

    cursor.execute('SELECT A2 FROM adarsh1 WHERE A1=%s', (ent,))
    row = cursor.fetchone()
    if row:
        self.label['text'] = row[0]

这又与整个单词匹配;只有当存在与A1完全匹配的行时才能返回该行。要使其适用于子字符串匹配,您可以使用LIKE查询:

def retrieve_inpu(self):
    ent = self.entry.get()

    cursor.execute('SELECT A2 FROM adarsh1 WHERE A1 LIKE %s', ('%{}%'.format(ent),))
    row = cursor.fetchone()
    if row:
        self.label['text'] = row[0]