Python 2.7 - MySQL: значение запроса не изменится при работе в бесконечном цикле - PullRequest
0 голосов
/ 28 февраля 2019

Идея состоит в том, чтобы отобразить окно сообщения после изменения значения.COUNT(*) переменной query в настоящее время равно 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)

1 Ответ

0 голосов
/ 28 февраля 2019

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'; до того, как вы начнететранзакции, поэтому ваша долгосрочная транзакция может автоматически видеть результат одновременных изменений.
...