Executando verificação de segurança...
1

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.

Carregando publicação patrocinada...
1

O retorno do seu select está trazendo registros duplicados devido aos joins?

Se for o caso coloca 'distinct' no seu select que ele filtra os registros repetidos.

1

Bom dia,

@diogomattioli

Não está sendo dupliado no select não. É a hora que pretendo fazer o insert na TABLE notifications que está sendo inserido duas vezes, sei que é nesse loop que está o erro, só não estou conseguindo resolver.

1

Está chegando os dois registro.
infraestrutura

Porém no insert está inserindo duplicado.
database

from src.database.connect import get_db_connection

from mysql.connector import  Error

import uuid

import datetime
def notifications():
    print("notifications")
    agora = datetime.datetime.now().strftime("%H:%M")
    try:
      connection =get_db_connection()
      cursor = connection.cursor()
      sql=f"SELECT  DISTINCT  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 = '14:20'"
      cursor.execute(sql)
      notification = cursor.fetchall()     
      print(notification)
      for r in notification:
        sql = f"INSERT INTO notifications (code_uuid,task_id,contributor_id) VALUES('{str(uuid.uuid4())}','{r[1]}','{r[0]}')"
        cursor.execute(sql)
        connection.commit()
    except Error as e:
      print("")
    finally:
      cursor.close()
      connection.close()