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