在Python中无需重启应用检索MySQL数据库新行
我用PHP和jQuery/AJAX做了一个聊天应用,现在我想用Python(2.7.3)和Tkinter做一个图形界面的应用,用来查看和管理聊天记录。
我有一个MySQL数据库,用来存储用户和聊天信息。
在浏览器上,我通过使用setInterval和AJAX调用,可以在不刷新页面的情况下获取新消息。
在Python应用中,我用“after”来调用一个函数,像setInterval那样定时获取信息。我觉得这样是有效的。但是,我无法获取在浏览器中提交的新条目。
我该如何在不重启应用的情况下,获取新提交的条目(在Python应用启动后)呢?
我使用MySQLdb模块来访问和修改数据库,并且我是在本地环境下工作。
作为我尝试的一个例子,我贴出我的get_messages函数:
def get_messages(sohbet_id, messages_name):
messages_name.delete(1.0, END) # Remove the content of Text widget
sql = "SELECT *
FROM ileti
WHERE sohbet_id='" + str(sohbet_id) + "'
ORDER BY created ASC"
cursor.execute(sql)
result = cursor.fetchall() # Fetch all the chat info
chat = ""
for i in result:
name = chatter_name(i[1])
time = datetime.fromtimestamp(i[4]).strftime("%H:%M:%S")
chat += time + " " + str(name) + ": " + str(i[3]) + "\n" # Create a string of chat messages
messages_name.insert(END, chat) # Insert all the chat messages to the Text widget
messages_name.yview(END) # Scroll it down so that the latest message can be seen
messages_name.after(1000, lambda: get_messages(sohbet_id, messages_name)) # Run this again after 1 second
return
补充说明: 还有一点信息: 我实际上是在函数中创建小部件。当应用启动时,只有主框架存在,我调用一个函数来创建第一个标签(所有聊天的汇总),然后那个函数又调用另一个函数来打开新的标签(单独的)聊天。在那些单独聊天的标签中,我有这个get_messages函数,用来查询属于那个聊天(或标签)的聊天消息。在上面的函数中,messages_name实际上是一个文本小部件。我把它传给函数,因为我在那个函数中要修改它(我找不到其他方法)。当get_messages被调用时,没有新行出现。获取新行的唯一方法就是重启应用。就像应用启动时,它只在那个时刻从数据库获取所有数据,然后就没了。我知道的唯一一点是,我需要一种类似PHP和jQuery/AJAX的方式来访问数据库,获取行而不刷新页面。
1 个回答
在一个类里面连接数据库,并且用方法来获取和插入数据,解决了我的问题。
这是我的类:
class DBConnection(object):
def __init__(self, DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME):
self.host = DB_HOST
self.port = DB_PORT
self.name = DB_NAME
self.user = DB_USER
self.password = DB_PASSWORD
self.con = None
def connect_db(self):
if self.con is None:
self.con = MySQLdb.connect(host = self.host,
port = self.port,
db = self.name,
user = self.user,
passwd = self.password)
self.con.set_character_set("utf8")
return self.con
def fetch_db(self, query):
self.query = query
self.cursor = self.con.cursor()
self.cursor.execute("SET NAMES utf8;")
self.cursor.execute("SET CHARACTER SET utf8;")
self.cursor.execute("SET character_set_connection=utf8;")
self.cursor.execute(self.query)
self.result = self.cursor.fetchall()
return self.result
def insert_db(self, query):
self.query = query
self.cursor = self.con.cursor()
self.cursor.execute("SET NAMES utf8;")
self.cursor.execute("SET CHARACTER SET utf8;")
self.cursor.execute("SET character_set_connection=utf8;")
self.cursor.execute(self.query)
self.con.commit()
return
这是我连接数据库的方式(在主循环之前):
DBC = DBConnection('localhost',3306,'root','','sohbet')
con = DBC.connect_db()
这是我进行查询的方式:
result = DBC.fetch_db("SELECT * FROM ileti WHERE sohbet_id='" + str(sohbet_id) + "' ORDER BY created ASC")
不过,我需要检查一下查询的方式,正如mmgp所说的。