Не обновляются записи в Mysql select на python

Запускаю скрипт, все выводит правильно.

Но если во время выполнения скрипта ручками (или другим скриптом) подправить поле is_deleted у любой записи, то в выводе программы ничего не поменяется ?

Что я делаю не так?

P.S. если добавить cnx.commit() внутрь цикла, то все заработает. Но ведь он нужен только для insert/update/delete ? Что-то я запутался

import mysql.connector
import time
 
cnx = mysql.connector.connect(
user='username',
password='password',
host='hostname',
database='database_name')
 

while True:
    cursor = cnx.cursor()
    query = ("SELECT id, name FROM students WHERE is_deleted = 0 ")
    cursor.execute(query) 
    for (student) in cursor:
        print(student[1] )
    cursor.close()
    time.sleep(0.1)

cnx.close()

Ответы (1 шт):

Автор решения: Beneviento

Проблема, возникает из-за того, что ваш скрипт выполняет запрос к базе данных только один раз при каждой итерации цикла while. Если в процессе выполнения скрипта поле is_deleted для какой-либо записи изменяется, то вам нужно выполнять запрос к базе данных повторно, чтобы учесть эти изменения. Ваш текущий код не выполняет повторных запросов после инициализации.

Если таким образом изменить код, то по идее все должно работать как нужно:

import mysql.connector
import time

cnx = mysql.connector.connect(
    user='username',
    password='password',
    host='hostname',
    database='database_name'
)

while True:
    cursor = cnx.cursor()
    query = ("SELECT id, name FROM students WHERE is_deleted = 0")
    cursor.execute(query)

    for (student) in cursor:
        print(student[1])

    cursor.close()
    time.sleep(0.1)

В этой версии кода у вас будет создан новый курсор на каждой итерации цикла, что позволит вам выполнять новый запрос к базе данных и учитывать изменения, внесенные в поле is_deleted. Кроме того, вы можете использовать time.sleep(0.1) для добавления задержки между итерациями цикла, чтобы не нагружать систему излишне.

→ Ссылка