【问题标题】:Python 2.7 - MySQL: Query value won't change while running on infinite loopPython 2.7 - MySQL:在无限循环上运行时查询值不会改变
【发布时间】:2019-02-28 18:54:47
【问题描述】:

这个想法是在值更改后显示一个消息框。 query 变量的 COUNT(*) 当前为 0。当程序在无限循环中运行以检查是否有任何更改时,会创建一个新请求,并且计数现在应该为 1。 但是,这不会发生。控制台不断打印No new Tickets

为什么在后台发生变化时query (row)变量没有更新?

如果我终止程序并重新运行它,它将获得新值。

while True:

#if this count increases by 1 send a notification in python that there is a new ticket     
query = """
        SELECT  COUNT(*)#q.id, q.Name, q.Description, t.Created, t.Subject
        FROM
        Queues as q
        LEFT JOIN Tickets as t
        on q.id = t.Queue
        LEFT JOIN Users as u
        on u.id = t.Owner
        WHERE
        q.id = 1 AND u.id = 10 AND t.Status = 'New'
        AND
        STR_TO_DATE(t.Created, "%Y-%m-%d") = CURDATE();
"""

cursor = conn.cursor()
cursor.execute(query)
row = cursor.fetchone()
#Debug for printing the current count
print row[0]
#if the current count of unowned and status ="new" tickets is greater than 0 send a notification.
if(row[0] > 0):
    ctypes.windll.user32.MessageBoxW(0, u"New Ticket Available", u"NEW TICKET", 1)
else:
    print "No new Tickets"
time.sleep(5)

【问题讨论】:

    标签: python mysql python-2.7


    【解决方案1】:

    https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlconnection-commit.html

    ...默认情况下,Connector/Python 不会自动提交,在每个修改使用事务存储引擎的表的数据的事务之后调用此方法很重要。

    此外,如果您的事务隔离级别是默认的(REPEATABLE-READ),那么对同一事务的后续查询将始终得到相同的结果,即使同时新数据一直在更改。

    你有两个选择:

    • 调用 conn.commit() 以在循环开始时获取数据库的新快照。
    • set tx_isolation='REPEATABLE-READ'; 在您开始事务之前,这样您的长时间运行的事务可以自动查看并发更改的结果。

    【讨论】:

    • 谢谢比尔,就是这样。
    猜你喜欢
    • 2020-12-13
    • 2016-01-05
    • 2015-10-13
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    相关资源
    最近更新 更多