Licença para expressar minha duvida. Estou com uma duvida de uma logica em python.
Link do repositório https://github.com/heuderdev/notifications
Estou fazendo um sisteminha que tenha a capacidade de notificar um usuário que ele deve executar uma tarefa em um determinado horário.
Estou usando CronJob do Python para fazer isso, e realmente ele está conseguindo fica executando de tempos e tempos.
A idéia aqui é quando tiver uma tarefa para ser executada preciso salvar no banco de dados na TABLE notifications.
Essa procedure está trasendo o seguinte resultado:
// cursor.callproc('PROCEDURE_VERIFY_TASKS',['00:00'])
[(1, 1, 'Tomar água, faz bem pra saúde;', '00:00', 'heuder.sena'), (1, 2, 'verificar a quantidade de chamados no topdesk.', '00:00', 'heuder.sena'), (1, 3, 'TIRAR O REGISTRO DO ANALITICO', '00:00', 'heuder.sena')]
O select que essa procedure faz é cursor.callproc('PROCEDURE_VERIFY_TASKS',['00:00'])
select
contributions.id as contributions_id,
tasks.id as tasks_id,
tasks.name AS tasks_name,
schedules.time AS schedules_time,
contributions.name AS contributions_name
from tasks
inner join schedules_tasks on schedules_tasks.task_id = tasks.id
inner join schedules on schedules.id = schedules_tasks.schedule_id
inner join contributors_tasks on contributors_tasks.task_id = tasks.id
inner join contributions on contributions.id = contributors_tasks.contributor_id
WHERE schedules.time = '00:00';
CREATE TABLE notifications(
`id` INT(11) AUTO_INCREMENT,
`code_uuid` VARCHAR(255) NOT NULL,
`was_verified` TINYINT(1) NOT NULL DEFAULT 0, -- = foi verificado
`task_id` INT(11) NOT NULL,
`contributor_id` INT(11) NOT NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY(id)
);
Logo a seguir temos o código que está fazendo o CronJob, o problema que estou enfretando é que ao passar pelo loop está inserindo duplicado cada notificação.
def cron_job():
print("INICIANDO O JOB")
agora = datetime.datetime.now().strftime("%H:%M")
try:
connection = get_db_connection()
cursor = connection.cursor()
cursor.callproc('PROCEDURE_VERIFY_TASKS',['00:00'])
NOTIFICATION = []
for result in cursor.stored_results():
print(result.fetchall())
for (r,i) in result.fetchall():
sql = f"INSERT INTO notifications (code_uuid,task_id,contributor_id) VALUES('{str(uuid.uuid4())}','{r[0]}','{r[1]}')"
cursor.execute(sql)
connection.commit()
print(i)
print(r)
except Error as e:
print(e)
finally:
cursor.close()
connection.close()
print("FIM DO JOB")
sched = BackgroundScheduler(daemon=True)
sched.add_job(cron_job,'interval',seconds=5)
sched._job_defaults["misfire_grace_time"] = 30
sched.start()
Código completo: https://github.com/heuderdev/notifications/blob/main/app.py
Humildemente gostária que alguem podesse me ajudar a entender essa lógica, pois ainda sou um iniciante. Na verdade essa é a primeira vez que faço algo em Python.