【问题标题】:web2py Scheduled task to recreate (reset) databaseweb2py 计划任务重新创建(重置)数据库
【发布时间】:2015-08-26 20:05:55
【问题描述】:

我正在处理一个放置具有 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) )

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

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

谢谢!

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

【问题讨论】:

    标签: python sqlite cron web2py scheduler


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-01-07
      • 2018-12-01
      • 2014-03-23
      • 2015-12-23
      • 2011-11-15
      • 2015-03-14
      • 1970-01-01
      • 2011-11-28
      • 2018-12-24
      相关资源
      最近更新 更多