Python Luigi工作流中的MySQL目标
我的TaskB需要TaskA,完成后TaskA会写入MySQL表,然后TaskB会将此输出作为其输入接收到表中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
我似乎不知道如何在路易吉做到这一点。有人能给我举个例子吗?或者给我一个简单的例子吗?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”,它可能是由作业更新的表。