@zzmaster

Почему не забираются новые записи из таблицы?

Python3.10

У меня скрипт в цикле забирает события из базы, обрабатывает их и удаляет.

import mysql.connector
import logging
from logging.handlers import RotatingFileHandler

scope.mysqldb = mysql.connector.connect(**mysql_connect)
scope.mysqlcursor = scope.mysqldb.cursor(dictionary=True)
init_logger()

while time_limit() > 0:
	scope.mysqlcursor.execute("SELECT * FROM subscriptions_events ORDER BY event_at ASC LIMIT 500");
    events = scope.mysqlcursor.fetchall();
	print (f"found {len(events)} subscription events")
	logger.info(f"found {len(events)} subscription events")
    if 0 == len(events):
		print ('sleeping')
        time.sleep(1)
        continue
	
	# process events
	# delete events



def init_logger(log_file='sync.log'):
    global logger;    
    logger = logging.getLogger('my_logger')
    logger.setLevel(logging.DEBUG)

    handler = RotatingFileHandler('sync.log', mode='a', maxBytes=1 * 1024 * 1024, backupCount=0)
    handler.setLevel(logging.DEBUG)

    formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)

    logger.addHandler(handler)


Если в таблице, например 800 событий, то он печатает
found 500 subscription events
found 300 subscription events
found 0 subscription events


Все нормально. Но если потом в таблице появляются новые события, то уже запущенный скрипт их не видит - он печатает по прежнему
found 0 subscription events
И только если скрипт перезапустить, то он видит новые события.
Еще одна непонятка. Строка с количеством найденных записей пишется также и в логфайл. Но когда скрипт не получает новых записей, то лог файл даже не создается, хотя в консоль печатается дальнейший "sleeping". Но если перезапустить скрипт при наличии пустой таблицы - то в лог файл все пишется.

Таблица заполняется триггером.

Почему так?
  • Вопрос задан
  • 110 просмотров
Решения вопроса 1
@zzmaster Автор вопроса
Да, дело в том, что обычный connect настолько "офигенный", что неявно запускает транзакцию. Чтоб этого избежать, надо
mysql.connector.connect(..., autocommit=True)

Спасибо Сергей Соловьев за подсказку, написал бы ты все подробно, отметил бы решением
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
AshBlade
@AshBlade
Просто хочу быть счастливым
Ты в самом начале запускаешь транзакцию и только с ней работаешь. Конечно новых записей не увидишь.
Изучи, что такое изоляции транзакций
Ответ написан
Комментировать
Revencu
@Revencu
Добавь в цикл перед селектом
scope.mysqldb.commit()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы