4

我刚开始使用luigi图书馆。我经常抓取网站并将任何新记录插入 Postgres 数据库。当我试图重写部分脚本以使用luigi时,我不清楚应该如何使用“标记表”

工作流程

  1. 抓取数据
  2. 查询数据库以检查新数据是否与旧数据不同。
  3. 如果是这样,请将新数据存储在同一个表中。

但是,使用 luigi'spostgres.CopyToTable时,如果表已经存在,则不会插入新数据。我想我应该使用表inserted中的列table_updates来确定应该插入哪些新数据,但我不清楚这个过程是什么样的,我在网上找不到任何明确的例子。

4

1 回答 1

2

您不必太担心标记表:它是 luigi 用来跟踪已成功执行的任务的内部表。为此,luigi 使用update_id您的任务的属性。如果你没有声明一个,那么 luigi 将使用task_id 这里所示的。该 task_id 是任务系列名称和任务的前三个参数的串联。

这里的关键是覆盖update_id任务的属性并返回一个自定义字符串,您将知道该字符串对于您的任务的每次运行都是唯一的。通常您应该使用任务的重要参数,例如:

@property
def update_id(self):
    return ":".join(self.param1, self.param2, self.param3)

重要的意思是改变任务输出的参数。我想像网站 url o id 和抓取日期之类的参数。对于这些任务中的任何一个,数据库的主机名、端口、用户名或密码等参数都是相同的,因此它们不应被视为重要。

请注意,如果没有关于您的表和您尝试保存的数据的详细信息,很难说您必须如何构建该 update_id 字符串,所以请小心。

于 2016-11-21T13:50:22.657 回答