- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 flask.ext.sqlalchemy
和 apscheduler.schedulers.background
的 Python Flask 应用程序。我创建了一个 JobStore 并获得了一个名为 apscheduler_jobs
的表,它包含以下字段:
|id |next_run_time|job_state|
------------------------------
|TEXT| REAL | TEXT |
我想使用如下方式将 SQLAlchemy 模型对象关联到该表:
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
scheduler.add_jobstore('sqlalchemy', url=app.config['SQLALCHEMY_DATABASE_URI'])
class Event(db.Model):
__tablename__ = "event"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(255), nullable=False)
jobs = db.relationship('scheduler', backref='apscheduler_jobs')
所以我想使用 APScheduler apscheduler_jobs 中的表,然后将其与我的 Event 对象的外键相关联。最后一行基本上会中断,因为“调度程序”不是定义的 SQLAlchmey 模型
qlalchemy.exc.InvalidRequestError: When initializing mapper Mapper|Event|event, expression 'scheduler' failed to locate a name ("name 'scheduler' is not defined"). If this is a class name, consider adding this relationship() to the <class 'project.models.Event'> class after both dependent classes have been defined.
所以我认为我需要一个名为“job”或其他东西的中间模型类,然后将其与 apscheduler_jobs 相关联,但这里的某些东西仍然感觉很糟糕 - 因为 APScheduler 正在制作这个表我无法控制那里发生的事情- 我应该担心吗?
编辑 1:所以我创建了 2 个模型,一个“事件”然后一个“工作”,然后“工作”与表 apscheduler_jobs
class Job(db.Model):
__tablename__ = "job"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(255), nullable=False)
apscheduler_job_id = db.Column(db.Integer, db.ForeignKey('apscheduler_jobs.id'))
event_id = db.Column(db.Integer, db.ForeignKey('event.id'))
问题是,当我删除数据库并重新创建它时,它抛出了错误:
sqlalchemy.exc.NoReferencedTableError:与“job.apscheduler_job_id”列关联的外键找不到用于生成目标列“id”的外键的表“apscheduler_jobs”
现在我可以在我的数据库创建脚本中解决这个问题,但我还是觉得我做错了
编辑2我设法让它工作,虽然这感觉很不对,但我现在有 3 个模型:Event、Job 和 APSchedulerJobsTable。最终模型基本上与 APScheduler apscheduler_jobs 的外观相匹配。不过,必须有更好的方法来做到这一点。
from project import db
class Event(db.Model):
__tablename__ = "event"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(255), nullable=False)
jobs = db.relationship('Job', backref='job_event')
class Job(db.Model):
__tablename__ = "job"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
apscheduler_job_id = db.Column(db.TEXT, db.ForeignKey('apscheduler_jobs.id'))
event_id = db.Column(db.Integer, db.ForeignKey('event.id'))
class APSchedulerJobsTable(db.Model):
# TODO: This feels bad man
__tablename__ = "apscheduler_jobs"
id = db.Column(db.TEXT, primary_key=True, autoincrement=True)
next_run_time = db.Column(db.REAL)
job_state = db.Column(db.TEXT)
最佳答案
好吧,两个解决方案——在我看来都不是很完美:
解决方案一,可能更简洁 - 只需在包含 aspscheduler_job_ids 的作业表中有一个文本字段 - 虽然这不是外键,但一旦知道 aspscheduler_job ID,就可以继续并保存在job表中,以备后用
class Event(db.Model):
__tablename__ = "event"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(255), nullable=False)
jobs = db.relationship('Job', backref='job_event')
class Job(db.Model):
__tablename__ = "job"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
event_id = db.Column(db.Integer, db.ForeignKey('event.id'))
apscheduler_job_id = db.Column(db.TEXT)
捕获这个是为了删除完整的数据库,您需要运行它以包括删除非托管表 apscheduler_jobs
:
db.reflect()
db.drop_all()
方案二,将apscheduler表添加到model本身,然后设置外键:
class Event(db.Model):
__tablename__ = "event"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(255), nullable=False)
jobs = db.relationship('Job', backref='job_event')
class Job(db.Model):
__tablename__ = "job"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
event_id = db.Column(db.Integer, db.ForeignKey('event.id'))
apscheduler_job_id = db.Column(db.TEXT, db.ForeignKey('apscheduler_jobs.id'))
class APSchedulerJobsTable(db.Model):
# TODO: This feels bad man
__tablename__ = "apscheduler_jobs"
id = db.Column(db.TEXT, primary_key=True, autoincrement=True)
next_run_time = db.Column(db.REAL)
job_state = db.Column(db.TEXT)
job = db.relationship('Job', backref='job_event')
关于python - 如何将 APScheduler JobStore 与 SQLAlchemy 模型(外键)相关联 - Python Flask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33180618/
有没有支持quartz集群的redis jobStore? 有没有人能够构建它? 另一方面,什么是 quartz 簇?我的意思是,它是否能够让两个服务运行指向 redis 的相同 quartz.pro
嗯,我是 Quartz 的新手,我正在关注 this tutorial 并且我配置了我的调度程序实例和 quartz 以使用此属性: properties["quartz.jobStore.lockH
我正在使用 quartz 2.2.1 和 mysql 进行作业存储,为了创建新作业,它会用旧作业数据覆盖 mysql 表中的表内容。没有错误。 这是我的代码: import org.quartz.Sc
考虑这段小代码 from apscheduler.scheduler import Scheduler import time class First(): def __init__(self
我们在集群环境中使用 quartz 调度程序(集群中的两个节点,指向单个 Oracle 数据库)。目前我们有两个作业,几乎每一个小时运行一次。 我们有一个单独的数据库架构用于 quartz 作业。我们
我正在使用 Spring Framework 在 Oracle DB 上实现 Quartz Job Store。我的 ApplicationContext.xml 在下面
我正在使用这个hazelcast quartz scheduler JobStore用于调度后台作业。我正在使用: quartz :2.2.3 Hazelcast:3.7.2(使用默认配置在 Dock
当向调度程序添加或删除作业时,Quartz 偶尔会抛出 JobPersistenceException(在前面的 SQLiteException 之后)。 看起来值得注意的事情: Quartz.NET
我正在 Spring 中使用 JDBC JobStore 实现 Quartz 调度程序。我有一个用例,如果我的应用程序崩溃,并且它有作业要在调度程序崩溃和重新启动之间的时间范围内执行。我的方法是在调度
我希望你们中的一个可爱的人能够帮助我解决这个问题,因为我已经花费了许多徒劳的时间试图让一切都变得美好! 我已经将问题追溯到类加载,并且能够看到当 Quartz 尝试从 jobStore (jobSto
我有工作人员使用 APScheduler 执行任务。它第一天运行完美,然后在尝试获取下一个作业时崩溃了。在出现此类异常后我可以做一些重试吗?或者更好地防止这种情况发生? 这是调度程序代码: __jbs
我第一次存储作业并使用 crontrigger 和以下代码安排它们。 package com.generalsentiment.test.quartz; import static org.quart
我正在尝试为我的 Quartz Scheduler 应用程序配置 JDBC 作业存储。我已经创建了表并在 application.proprties 中提供了配置。但默认 RAM 作业存储正在初始化。
我在集群模式下使用 Quartz 由于过度调用,我在 DB 级别存在一些行锁争用: org.quartz.jobStore.selectWithLockSQL "SELECT * FROM QRTZ_
我想在运行相同作业的触发器之间保留重试计数数据。 我尝试将其存储到 JobExectionContext.JobDetails.JobDataMap 中,这是一个 DirtyHashMap。它被存储,
我正在使用 Flask Sqlalchemy,并在启动调度程序时将 mysql 作为作业存储。但有时当我将作业添加到调度程序时,它会抛出“Mysql Server has gone away”错误,可
我正在使用带有 quartz 的 JDBC 作业存储,因为在集群环境中管理作业。以下是我使用 mysql 的 jdbc 配置: #===============================
我目前正在将 Quartz 升级到版本 2.2。因此,我必须对 JDBCJobstore 使用的表进行一些迁移。 对于表“qrtz_fired_triggers”,添加了具有非空约束的“sched_t
我正在尝试 Quartz 调度程序,并设法使用 Maven 让它与 Spring 一起工作。 我需要做的是配置 Quartz 来存储作业,以便在预定的时间内执行作业。据我所知,Quartz 中有两种类
我有一个使用 flask.ext.sqlalchemy 和 apscheduler.schedulers.background 的 Python Flask 应用程序。我创建了一个 JobStore
我是一名优秀的程序员,十分优秀!