如何将APScheduler JobStore与SQLAlchemy模型(外键)关联-Python

如何将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模型对

我有一个Python Flask应用程序,它使用
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')