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

时间:2015-06-11 19:08:31

标签: python sqlite cron web2py scheduler

我正在处理一个CRON作业,该作业放置一个包含9000行设备名称的文本文件。

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

我遇到的是当我让以下工作人员将我的导入运行到我的数据库中时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 newb(我知道,我不知道的东西))

SOOOOOOO .....

这就是我想出来的,我不知道这是不是最好的做法。在创建条目的同一函数中使用db.[name].drop()时遇到的问题是db表不存在且我的作业状态变为“FAILED”。所以我在工作中定义了表格。见下文:

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) )

在Phoenix Rebirth的代码评论中。这是实现目标的最佳方式吗?

它在1开始我的身份证,这就是我想要的但是我应该怎么做呢?

谢谢!

P.S。请原谅我的windows dir结构示例,因为我当前的非prod沙箱是我的Windows工作站。 :(

1 个答案:

答案 0 :(得分:0)

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

...
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条目。你的时间不应超过半分钟。