2017-09-15 6 views
0

Vous ne savez pas comment stocker un travail sur une base de données. Chaque fois que je lance mon application flacon, il exécute la première fois et puis quand je arrêter le serveur et redémarrez l'application que je reçois l'erreur:Flask_APScheduler erreur de travail contradictoire?

sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: apscheduler_jobs.id [SQL: 'INSERT INTO apscheduler_jobs (id, next_run_time, job_state) VALUES (?, ?, ?)'] [parameters: ('job1', 1505488120.453826, <memory at 0x00000200DB4A6DC8>)] 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "run.py", line 4, in <module> 
    scheduler.start() 
    File "C:\Anaconda3\envs\g2x_flask\lib\site-packages\flask_apscheduler\scheduler.py", line 82, in start 
    self._scheduler.start() 
    File "C:\Anaconda3\envs\g2x_flask\lib\site-packages\apscheduler\schedulers\background.py", line 33, in start 
    BaseScheduler.start(self, *args, **kwargs) 
    File "C:\Anaconda3\envs\g2x_flask\lib\site-packages\apscheduler\schedulers\base.py", line 154, in start 
    self._real_add_job(job, jobstore_alias, replace_existing) 
    File "C:\Anaconda3\envs\g2x_flask\lib\site-packages\apscheduler\schedulers\base.py", line 851, in _real_add_job 
    store.add_job(job) 
    File "C:\Anaconda3\envs\g2x_flask\lib\site-packages\apscheduler\jobstores\sqlalchemy.py", line 94, in add_job 
    raise ConflictingIdError(job.id) 
apscheduler.jobstores.base.ConflictingIdError: 'Job identifier (job1) conflicts with an existing job' 

ressemble Mes app\__intel__.py fichiers:

from flask import Flask 
from flask_apscheduler import APScheduler 
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore 

from .models import db 


app = Flask(__name__) 
app.config.from_object('config.BaseConfig') 
db.init_app(app) 


class APSConfig(object): 
    JOBS = [ 
     { 
      'id': 'job1', 
      'func': 'intel_app.jobs:job1', 
      'args': (1, 2), 
      'trigger': 'interval', 
      'seconds': 10 
     } 
    ] 

    SCHEDULER_JOBSTORES = { 
     'default': SQLAlchemyJobStore(url=app.config['SQLALCHEMY_DATABASE_URI']) 
    } 

    SCHEDULER_EXECUTORS = { 
     'default': {'type': 'threadpool', 'max_workers': 20} 
    } 

    SCHEDULER_JOB_DEFAULTS = { 
     'coalesce': False, 
     'max_instances': 3 
    } 

    SCHEDULER_API_ENABLED = True 


app.config.from_object(APSConfig()) 

scheduler = APScheduler() 
scheduler.init_app(app) 

Il ressemble il essaie de recréer le travail avec le même jobid à chaque démarrage de l'application. Cependant, je ne suis pas sûr de savoir comment le créer une seule fois et si le travail est là pour l'utiliser depuis la base de données.

EDIT: Mon objectif éventuel est d'obtenir un travail qui extrait des données d'un site Web, puis stocke les données dans une base de données. Donc, je voudrais définir ce travail comme un travail cron et le déployer sur heroku.

Répondre

0

L'erreur que vous obtenez car l'ID du travail "travail1" existe déjà dans le magasin de travail (dans la base de données) et vous ne pouvez pas avoir le même ID de travail pour les différents travaux. L'identifiant du travail doit être unique. Vous pouvez attribuer un identifiant à 'Aucun' et le planificateur lui assignera automatiquement un identifiant. Le nouvel ID de travail sera en alphanumérique de longueur 32. Vous pouvez également générer votre propre uuid et l'attribuer à l'ID du travail.

0

Si vous utilisez un magasin de données, vous devez définir replace_existing sur True dans les paramètres du travail afin qu'APScheduler remplace le travail existant lorsqu'il redémarre. Voici un exemple de travail cron qui fonctionne avec SQLAlchemyJobStore:

'id': 'daily_email', 
    'func': send_daily_email, 
    'replace_existing': True, 
    'trigger': 'cron', 
    'misfire_grace_time': 600, 
    'max_instances': 1, 
    'hour': 22, # every day at 22:05 
    'minute': 5,