微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

APScheduler 只更新数据库一次

如何解决APScheduler 只更新数据库一次

我试图让 APScheduler 在我的 Flask 应用程序中每 5 分钟更新一次 Postgresql 数据库,但该数据库仅在第一次更新,所有后续时间都不会保存更改。 APScheduler 本身就可以正常工作,如果将更新数据库功能换成显示文本的功能,那么每次都可以正常工作。

在我的应用程序中使用 Flask-sqlAlchemy:

sqlALCHEMY_DATABASE_URI = 'postgresql+psycopg2://postgres:name@localhost/name'

APScheduler 代码如下所示:

from apscheduler.schedulers.blocking import BlockingScheduler

sched = BlockingScheduler(daemon=True)
sched.add_job(func=update,trigger='interval',minutes=5)
sched.start()

数据库更新函数如下所示:

def update():
    for i in data:
        for row in Names.query:
            if row.id == i['id']:
                row.name = i['name']
                row.gender = i['gender']
                row.age = i['age']
    db.session.commit()

在日志中,APScheduler 总是成功运行。我还查看了 Postgresql 日志,在那里我发现了这句话:“远程主机强制关闭了现有连接。”

我怀疑可能是数据库引擎和会话,但我还没有在 Flask-sqlAlchemy 包中找到我需要实现的说明。

包的版本:

Flask-sqlAlchemy==2.4.1
sqlAlchemy==1.3.17
APScheduler==3.6.3

数据库模型:

class Names(db.Model):
    __searchable__ = ['name','age']
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(40))
    gender = db.Column(db.String(40))
    age = db.Column(db.Numeric)
   
    def __repr__(self):
        return '<Names %r>' % self.id

解决方法

我想我想出了问题所在。 APScheduler 以某种方式在第一次使用变量时缓存它的内容,然后只使用该值。 在函数之前,我有以下代码:

request = requests.get('https://privateapi')
data = request.json()

然后函数从数据中获取数据:

def update():
    for i in data:
        for row in Names.query:
            if row.id == i['id']:
                row.name = i['name']
                row.gender = i['gender']
                row.age = i['age']
    db.session.commit()

根据Flask-SQLAlchemy的日志,数据写入数据库成功。我尝试添加到打印(数据)函数,以便它每 5 分钟向我显示数据变量的内容,我看到它的内容没有更新。

结果是数据被写入数据库,但具有相同的值,所以我没有看到它的更新。

然后我尝试缩短请求路径而不是将其内容保存到变量中:

def update():
    for i in requests.get('https://privateapi').json():
        for row in Names.query:
            if row.id == i['id']:
                row.name = i['name']
                row.gender = i['gender']
                row.age = i['age']
    db.session.commit()

但这里没有任何改变。

更新: 我通过删除函数末尾的数据变量解决了这个问题:

def update():
    name = requests.get('https://privateapi').json()
    for i in name:
        for row in Names.query:
            if row.id == i['id']:
                row.name = i['name']
                row.gender = i['gender']
                row.age = i['age']
    del name
    db.session.commit()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。