Flask_APScheduler冲突的作业错误?

spi*_*edd 0 python flask python-3.x apscheduler

不确定如何在数据库上存储作业。每当我运行flask应用程序时,它就会第一次运行,然后在关闭服务器并重新启动应用程序时出现错误:

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'
Run Code Online (Sandbox Code Playgroud)

我的app\__intel__.py文件如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

看起来每次应用程序启动时它都试图使用相同的jobid重新创建作业,但是,我不确定如何仅一次创建作业,然后从数据库中使用该作业来获取它。

编辑:我最终的目标是找到一份工作,从网站上提取数据,然后将数据存储在数据库中。因此,我想将此作业设置为cron作业并将其部署在heroku上。

Dut*_*ers 5

如果使用的是数据存储,则应在作业参数中设置replace_existingTrue,以便APScheduler在重新启动时替换现有作业。这是与SQLAlchemyJobStore一起使用的cron作业示例:

    '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,
Run Code Online (Sandbox Code Playgroud)