如何将APScheduler JobStore与SQLAlchemy模型(外键)关联-Python
我有一个Python Flask应用程序,它使用如何将APScheduler JobStore与SQLAlchemy模型(外键)关联-Python,python,flask,sqlalchemy,flask-sqlalchemy,apscheduler,Python,Flask,Sqlalchemy,Flask Sqlalchemy,Apscheduler,我有一个Python Flask应用程序,它使用Flask.ext.sqlalchemy和apscheduler.schedulers.background。我创建了一个JobStore,得到了一个名为apscheduler\u jobsis的表,其中包含以下字段: |id |next_run_time|job_state| ------------------------------ |TEXT| REAL | TEXT | 我想使用如下方式将SQLAlchemy模型对
Flask.ext.sqlalchemy
和apscheduler.schedulers.background
。我创建了一个JobStore,得到了一个名为apscheduler\u jobs
is的表,其中包含以下字段:
|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\u作业中的表,然后将其与我的事件对象的外键相关联。最后一行将基本中断,因为“调度器”不是定义的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.
问题是,当我删除数据库并重新创建它时,它抛出了错误:
sqlalchemy.exc.norReferencedTableError:与列“job.apscheduler\u job\u id”关联的外键找不到表“apscheduler\u jobs”,无法使用该表生成指向目标列“id”的外键。
现在我可以在我的数据库创建脚本中解决这个问题,但我仍然觉得我这样做是错误的
EDIT2
我设法让它工作,虽然这感觉很不对,但我现在有3个模型:事件、作业和APSchedulerJobsTable。最终的模型基本上与APScheduler APScheduler_作业的外观相匹配。不过,一定有更好的办法
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)
好的,有两种解决方案-都不是真正完美的IMO: 解决方案一,可能更干净-只需在作业表中有一个包含aspscheduler\u作业\u ID的文本字段-虽然这不是外键,但一旦知道aspscheduler\u作业ID,就可以继续并将其存储在作业表中以供以后参考
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\u作业
:
db.reflect()
db.drop_all()
解决方案二,将apscheduler表添加到模型本身,然后设置外键:
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')
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')