Python Luigi工作流中的MySQL目标

Python Luigi工作流中的MySQL目标,python,mysql,luigi,Python,Mysql,Luigi,我的TaskB需要TaskA,完成后TaskA会写入MySQL表,然后TaskB会将此输出作为其输入接收到表中 我似乎不知道如何在路易吉做到这一点。有人能给我举个例子吗?或者给我一个简单的例子吗?luigi中现有的MySqlTarget使用一个单独的标记表来指示任务何时完成。这是我将采取的粗略方法…但是你的问题非常抽象,所以在现实中可能会更复杂 import luigi from datetime import datetime from luigi.contrib.mysqldb import

我的TaskB需要TaskA,完成后TaskA会写入MySQL表,然后TaskB会将此输出作为其输入接收到表中


我似乎不知道如何在路易吉做到这一点。有人能给我举个例子吗?或者给我一个简单的例子吗?

luigi中现有的MySqlTarget使用一个单独的标记表来指示任务何时完成。这是我将采取的粗略方法…但是你的问题非常抽象,所以在现实中可能会更复杂

import luigi
from datetime import datetime
from luigi.contrib.mysqldb import MySqlTarget


class TaskA(luigi.Task):
    rundate = luigi.DateParameter(default=datetime.now().date())
    target_table = "table_to_update"
    host = "localhost:3306"
    db = "db_to_use"
    user = "user_to_use"
    pw = "pw_to_use"

    def get_target(self):
        return MySqlTarget(host=self.host, database=self.db, user=self.user, password=self.pw, table=self.target_table,
                           update_id=str(self.rundate))

    def requires(self):
        return []

    def output(self):
        return self.get_target()

    def run(self):
        #update table
        self.get_target().touch()


class TaskB(luigi.Task):
    def requires(self):
        return [TaskA()]

    def run(self):
        # reading from target_table

谢谢你,马特。这真的很有帮助。但我有一个问题?这是否意味着MySqlTarget使用update_id跟踪正在更新的行,update_id是行的主要id。在这种情况下,如果我的主ID是自动递增的,我该怎么办?哦,这很棘手。我认为您必须使用自动增量id之外的另一个唯一值作为更新id。它实际上正在运行
“插入到{marker_table}(update_id,target_table)重复键上的值(%s,%s)更新id=VALUES(update_id)”。格式(marker_table=self.marker_table),(self.update\u id,self.table)
因此,解决方案似乎有一个记录工作流更新的更新表?但是我不想为每个任务维护一个表(我有很多任务。)因此,从您对正在发生的事情的sql解释来看,似乎我应该这样做
返回MySqlTarget(host=self.host,database=self.db,user=self.user,password=self.pw,table=self.target\table,update\id=str(self.rundate),update\u task\u type=task\u a)
是的,MySQLTarget默认情况下就是这样做的,它会创建“标记表”。该表中的一列是“target_table”,它可能是由作业更新的表。