使用luigi更新Postgres表

时间:2016-11-20 17:22:14

标签: postgresql python-3.5 luigi

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

工作流

  1. 抓取数据
  2. 查询数据库以检查新数据是否与旧数据不同。
  3. 如果是,请将新数据存储在同一个表中。
  4. 但是,使用luigi的postgres.CopyToTable,如果表已经存在,则不会插入新数据。我想我应该使用inserted表格中的table_updates列来确定应该插入哪些新数据,但我不清楚这个过程是什么样的,我可以&#39 ;在网上找到任何明确的例子。

1 个答案:

答案 0 :(得分:1)

您不必太担心标记表:它是一个内部表,luigi用于跟踪哪个任务已成功执行。为此,luigi使用您任务的update_id属性。如果你没有宣布一个,那么luigi将使用task_id as shown here。 task_id是任务系列名称和任务的前三个参数的串联。

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

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

重要我指的是更改任务输出的参数。我想象网站url o id和抓日期等参数。对于任何这些任务,数据库的主机名,端口,用户名或密码等参数都是相同的,因此它们不应被视为重要任务。

请注意,如果没有关于您的表格的详细信息以及您尝试保存的数据非常难以说明您必须如何构建该update_id字符串,那么请小心。