在 Python 中无需重新启动应用程序即可检索 MySQL 数据库的新行

Posted

技术标签:

【中文标题】在 Python 中无需重新启动应用程序即可检索 MySQL 数据库的新行【英文标题】:Retrieving New Rows of MySQL Database without Restarting App in Python 【发布时间】:2013-01-25 07:12:37 【问题描述】:

我使用 jQuery/AJAX 在 php 中创建了一个聊天应用程序。现在我正在尝试创建一个带有 GUI (Tkinter) 的 Python (2.7.3) 应用程序,用于查看和管理聊天。

我有一个存储用户和聊天信息的 mysql 数据库。

在浏览器上,通过使用 setInterval 和 AJAX 调用,我可以在不刷新页面的情况下获取新消息。

在 Python 应用程序中,我使用“after”来调用一个函数来检索 setInterval 等信息。我认为它正在工作。但是,我无法获得在浏览器上提交的新条目。

如何在不重启应用的情况下获取新提交的条目(在 Python 应用启动后)?

我正在使用 MySQLdb 模块来访问和更改数据库,并且我正在使用 localhost。

作为一个示例,我将发布我的 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 实际上是一个 Text 小部件。我将它传递给函数,因为我正在该函数中修改它(我找不到任何其他方式)。当调用 get_messages 时,不会出现新行。获得它们的唯一方法是重新启动应用程序。就像当应用程序启动时,它会从该实例中的数据库中获取所有数据,仅此而已。我唯一知道的是,我需要类似 PHP 和 jQuery/AJAX 的方式来访问数据库并在不刷新页面的情况下获取行。

【问题讨论】:

永远不要执行这样的 SQL 查询,用 Python 术语来说,你是在参数化查询之后。除此之外,尚不清楚这与 tkinter 有什么关系。执行该查询后,如果您打印result,您得到的行数是否比messages_name 小部件中显示的行数多?如果没有,您必须首先修复数据库的更新方式。 @mmgp 我实际上是在函数中创建小部件。当应用程序启动时,只有主框架在那里,我调用一个函数来创建第一个选项卡(所有聊天的摘要),然后该函数调用另一个打开新选项卡(个人)聊天的函数。在那些单独的聊天标签中,我有这个get_messages 函数来查询属于该聊天(或标签)的聊天消息。在上面的函数中messages_name实际上是一个Text小部件。我将它传递给函数,因为我正在该函数中修改它(我找不到任何其他方式)。 @mmgp (继续...) 当get_messages 被调用时,不会出现新行。获得它们的唯一方法是重新启动应用程序。就像当应用程序启动时,它会从该实例中的数据库中获取所有数据,仅此而已。我唯一知道的是,我需要类似 PHP 和 jQuery/AJAX 的方式来访问数据库并在不刷新页面的情况下获取行。对于 SQL 查询,我会看一下,谢谢指出;我对 Python 还很陌生。 当应用程序启动时,它肯定不会“从数据库中获取所有数据”,它不会像那样工作(或者你有一些其他非常重要的代码没有显示)。由于您从不显示数据库是如何更新的,因此这里没有其他事情可做。 @mmgp 数据以两种方式插入数据库,在浏览器上使用 PHP 和在 Python 中。当我用 PHP 发送内容时,它会出现在浏览器上,但不会出现在 Python 应用程序中。但是,当我在 Python 中发送消息时,它同时出现在两者中。不知何故,我无法在浏览器上插入数据。所有这些都在数据库的同一张表中。如果有必要,我可能会发布所有代码。大概有 150 行长,我不想弄得一团糟。 【参考方案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 告诉我的查询方式。

【讨论】:

以上是关于在 Python 中无需重新启动应用程序即可检索 MySQL 数据库的新行的主要内容,如果未能解决你的问题,请参考以下文章

Rabbitmq 无需重启即可重新加载/刷新新证书

Angular App 无需重新编译即可动态加载插件

在 iOS 应用中无需征求用户许可即可检索哪些其他信息

无需重启即可安装 Jenkins 插件

在 Python 中无需单击即可执行函数 | Pyside [重复]

js代码在导航路线后停止工作而无需重新启动页面