我正在处理一个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工作站。 :(
答案 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条目。你的时间不应超过半分钟。