我有一個使用flask.ext.sqlalchemy
和apscheduler.schedulers.background
的Python Flask應用程序。我創建了一個作業存儲,並得到一個名爲apscheduler_jobs
表具有以下字段:如何將APScheduler JobStore與SQLAlchemy模型(外鍵)相關聯 - Python Flask
|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.
所以我想我需要所謂的「工作」或類似的插圖中的Model類,則涉及,要apscheduler_jobs,但這裏的東西仍然感覺不好 - 因爲APScheduler正在製作這張桌子,我無法控制那裏正在發生的事情 - 我應該關注嗎?
EDIT1: 所以我創建了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'))
問題存在,當我放棄了DB和重建它它拋出的錯誤:
sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'job.apscheduler_job_id' could not find table 'apscheduler_jobs' with which to generate a foreign key to target column 'id'
現在我能得到解決,在我的數據庫創建腳本,但同樣它仍然感覺就像我DOI NG這種錯誤的方式
EDIT2 我設法得到它的工作,雖然這感覺很不對勁,我現在已經有3種型號:事件,工作,和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)