2016-11-20 90 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字符串,因此請小心。