python - web2py 计划任务重新创建(重置)数据库

标签 python sqlite cron web2py scheduler

我正在处理一个放置具有 9000 行设备名称的文本文件的 CRON 作业。

该作业每天使用来自我们域中的网络爬虫的更新列表重新创建文件。

我遇到的情况是,当我让以下工作人员将我的导入运行到我的数据库中时,db.[name].id用下面的这种方法不断增长
scheduler.py

# -*- coding: utf-8 -*-
from gluon.scheduler import Scheduler
def demo1():
    db(db.asdf.id>0).delete()
    db.commit()
    with open('c:\(project)\devices.list') as f:
        content = f.readlines()
        for line in content:
            db.asdf.insert(asdf = line)
    db.commit()

mysched = Scheduler(db, tasks = dict(demo1 = demo1) )
default.py (初始开球)
@auth.requires_membership('!Group-IS_MASTER')
def rgroup():
    mysched.queue_task('demo1',start_time=request.now,stop_time = None,prevent_drift=True,repeats=0,period=86400)

    return 'you are member of a group!'

因此,下次工作开始时,它将从 db.[name].id = 9001 开始。 .因此,根据爬虫的返回,ID 号每天都会增长 9000 左右。它看起来很草率,我不想在多年后遇到我不知道的数据库限制问题。

(我是 DB 新手(我知道,我什么都不知道))

呜呜呜……

这是我想出的,我不知道这是否是最佳做法。还有一个我在使用 db.[name].drop() 时遇到的问题在创建条目的同一函数中,数据库表不存在,我的工作状态变为“失败”。所以我在工作中定义了表格。见下文:
scheduler.py
from gluon.scheduler import Scheduler
def demo1():
    db.asdf.drop()  #<=====Kill db.asdf
    db.commit()     #<=====Commit Kill
    db.define_table('asdf',Field('asdf'),auth.signature )  #<==== Phoenix Rebirth!!!
    with open('c:\(project)\devices.list') as f:
        content = f.readlines()
        for line in content:
            db.asdf.insert(asdf = line)
    db.commit()     #<=========== Magic

mysched = Scheduler(db, tasks = dict(demo1 = demo1) )

在上面代码注释中的凤凰重生行中。这是实现我的目标的最佳方式吗?

我的 ID 从 1 开始这就是我想要的,但我应该这样做吗?

谢谢!

附言请原谅我使用 Windows 目录结构的示例,因为我当前的非产品沙箱是我的 Windows 工作站。 :(

最佳答案

为什么不在插入相应记录之前检查该行是否存在?

...
with open('c:\(project)\devices.list') as f:
    content = f.readlines()
    for line in content:
        # distinguishing t_ for tables and f_ for fields
        db_matching_entries = db(db.t_asdf.f_asdf==line).select()
        if len(db_matching_entries) == 0:
            db.t_asdf.insert(f_asdf = line)
        else:
            # here you could update your record, just in case ;-)
            pass
db.commit()     #<=========== Magic

有一个类似的过程,需要几秒钟才能完成 2k-3k 条目。你的时间不应该超过半分钟。

关于python - web2py 计划任务重新创建(重置)数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30789410/

相关文章:

python - 有什么办法可以在 python 中打开随机文件?

linux - CronTab 每 5 分钟重启一次不起作用

linux - 将值传递给 cron 中的脚本

python - 围绕一个第三方库设计我的域模型

Python 不能使用三元运算符在列表理解中使用解包

Python csv.DictReader - 如何反转输出?

Sqlite:选择分布在总记录上的记录

mysql - SQL 语句中的语法错误(如果不存在则创建表)

sqlite - SoapUI + sqlite-jdbc = ClassNotFoundException

bash - 如何安排每个月的第一个星期天运行