2016-11-20 50 views
3

我刚开始使用luigi库。我经常抓取一个网站并将任何新记录插入到Postgres数据库中。由于我试图重写部分脚本以使用luigi,因此我不清楚"marker table"应该如何使用。使用luigi更新Postgres表

工作流程

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

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

回答

1

你不必担心标记表太多:这是一个内部表luigi用来跟踪哪个任务已经成功执行。为了这样做,luigi使用你的任务的update_id属性。如果你没有申报,luigi将使用task_idas shown here。该task_id是任务系列名称和任务的前三个参数的串联。

此处的关键是覆盖您的任务的update_id属性,并返回一个自定义字符串,您将知道该字符串对于您的任务的每次运行都是唯一的。通常你应该用你的任务的显著参数,是这样的:

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

通过显著我的意思是改变你的任务的输出参数。我想像网站URL ID和刮日期等参数。任何这些任务的数据库的主机名,端口,用户名或密码等参数都是相同的,因此它们不应被视为重要的。

请注意,如果没有关于表格和数据的详细信息,您将很难说出如何构建update_id字符串,因此请小心。