fix(storage/executor): 修复 dir(rec) 取列 bug(DictObject 列名不暴露为实例属性),统一用 dict(rec) 取列
get_task/get_task_steps/list_tasks/list_human_tasks/get_human_task/get_pipeline_steps/_get_task_raw 全部改用 _rec_to_dict(dict(rec)),修复返回 dict 缺列名(如 state)导致 KeyError
This commit is contained in:
parent
a3a15ae666
commit
ec75ee0aad
@ -146,7 +146,10 @@ async def _get_task_raw(task_id: str) -> dict:
|
|||||||
if not recs:
|
if not recs:
|
||||||
return None
|
return None
|
||||||
rec = recs[0]
|
rec = recs[0]
|
||||||
return {k: getattr(rec, k) for k in dir(rec) if not k.startswith('_')} if hasattr(rec, '__dict__') else dict(rec)
|
try:
|
||||||
|
return dict(rec)
|
||||||
|
except (TypeError, ValueError):
|
||||||
|
return {k: getattr(rec, k) for k in dir(rec) if not k.startswith('_')}
|
||||||
|
|
||||||
|
|
||||||
async def _execute_step(task_id: str, step_name: str, step_graph: dict, task_info: dict):
|
async def _execute_step(task_id: str, step_name: str, step_graph: dict, task_info: dict):
|
||||||
|
|||||||
@ -19,6 +19,16 @@ def _get_db():
|
|||||||
return db, DBNAME
|
return db, DBNAME
|
||||||
|
|
||||||
|
|
||||||
|
def _rec_to_dict(rec):
|
||||||
|
"""sqlor 返回 DictObject,列名不暴露为实例属性(dir() 只列 dict 方法),须用 dict(rec) 取列。"""
|
||||||
|
if isinstance(rec, dict):
|
||||||
|
return dict(rec)
|
||||||
|
try:
|
||||||
|
return dict(rec)
|
||||||
|
except (TypeError, ValueError):
|
||||||
|
return {k: getattr(rec, k) for k in dir(rec) if not k.startswith('_')}
|
||||||
|
|
||||||
|
|
||||||
async def get_pipeline_steps(pipeline_id: str) -> list:
|
async def get_pipeline_steps(pipeline_id: str) -> list:
|
||||||
"""Read step definitions from pipeline_steps table (defined by pipeline_core).
|
"""Read step definitions from pipeline_steps table (defined by pipeline_core).
|
||||||
|
|
||||||
@ -32,10 +42,7 @@ async def get_pipeline_steps(pipeline_id: str) -> list:
|
|||||||
return []
|
return []
|
||||||
result = []
|
result = []
|
||||||
for rec in recs:
|
for rec in recs:
|
||||||
if hasattr(rec, '__dict__'):
|
d = _rec_to_dict(rec)
|
||||||
d = {k: getattr(rec, k) for k in dir(rec) if not k.startswith('_')}
|
|
||||||
else:
|
|
||||||
d = dict(rec)
|
|
||||||
# Extract deps from step_config JSON
|
# Extract deps from step_config JSON
|
||||||
cfg_raw = d.get('step_config', '{}')
|
cfg_raw = d.get('step_config', '{}')
|
||||||
try:
|
try:
|
||||||
@ -99,9 +106,7 @@ async def get_task(tenant_id: str, task_id: str) -> Optional[dict]:
|
|||||||
if not recs:
|
if not recs:
|
||||||
return None
|
return None
|
||||||
rec = recs[0]
|
rec = recs[0]
|
||||||
if hasattr(rec, '__dict__'):
|
return _rec_to_dict(rec)
|
||||||
return {k: getattr(rec, k) for k in dir(rec) if not k.startswith('_')}
|
|
||||||
return dict(rec)
|
|
||||||
|
|
||||||
|
|
||||||
async def get_task_steps(task_id: str) -> list:
|
async def get_task_steps(task_id: str) -> list:
|
||||||
@ -111,10 +116,7 @@ async def get_task_steps(task_id: str) -> list:
|
|||||||
recs = await sor.sqlExe("SELECT * FROM pipeline_task_steps WHERE task_id=${tid}$ ORDER BY step_order", {'tid': task_id})
|
recs = await sor.sqlExe("SELECT * FROM pipeline_task_steps WHERE task_id=${tid}$ ORDER BY step_order", {'tid': task_id})
|
||||||
result = []
|
result = []
|
||||||
for rec in (recs or []):
|
for rec in (recs or []):
|
||||||
if hasattr(rec, '__dict__'):
|
result.append(_rec_to_dict(rec))
|
||||||
result.append({k: getattr(rec, k) for k in dir(rec) if not k.startswith('_')})
|
|
||||||
else:
|
|
||||||
result.append(dict(rec))
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
@ -226,10 +228,7 @@ async def list_tasks(tenant_id: str, pipeline_id: str = None, limit: int = 100)
|
|||||||
recs = await sor.sqlExe(sql, {'tenant_id': tenant_id})
|
recs = await sor.sqlExe(sql, {'tenant_id': tenant_id})
|
||||||
result = []
|
result = []
|
||||||
for rec in (recs or [])[:limit]:
|
for rec in (recs or [])[:limit]:
|
||||||
if hasattr(rec, '__dict__'):
|
result.append(_rec_to_dict(rec))
|
||||||
result.append({k: getattr(rec, k) for k in dir(rec) if not k.startswith('_')})
|
|
||||||
else:
|
|
||||||
result.append(dict(rec))
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
@ -318,10 +317,7 @@ async def list_human_tasks(tenant_id=None, assignee_role=None, assignee_id=None,
|
|||||||
recs = await sor.sqlExe(sql, params)
|
recs = await sor.sqlExe(sql, params)
|
||||||
result = []
|
result = []
|
||||||
for rec in (recs or []):
|
for rec in (recs or []):
|
||||||
if hasattr(rec, '__dict__'):
|
d = _rec_to_dict(rec)
|
||||||
d = {k: getattr(rec, k) for k in dir(rec) if not k.startswith('_')}
|
|
||||||
else:
|
|
||||||
d = dict(rec)
|
|
||||||
# Parse JSON fields
|
# Parse JSON fields
|
||||||
for field in ('form_schema', 'result_data'):
|
for field in ('form_schema', 'result_data'):
|
||||||
if d.get(field) and isinstance(d[field], str):
|
if d.get(field) and isinstance(d[field], str):
|
||||||
@ -341,10 +337,7 @@ async def get_human_task(task_id, step_name):
|
|||||||
if not recs:
|
if not recs:
|
||||||
return None
|
return None
|
||||||
rec = recs[0]
|
rec = recs[0]
|
||||||
if hasattr(rec, '__dict__'):
|
d = _rec_to_dict(rec)
|
||||||
d = {k: getattr(rec, k) for k in dir(rec) if not k.startswith('_')}
|
|
||||||
else:
|
|
||||||
d = dict(rec)
|
|
||||||
for field in ('form_schema', 'result_data'):
|
for field in ('form_schema', 'result_data'):
|
||||||
if d.get(field) and isinstance(d[field], str):
|
if d.get(field) and isinstance(d[field], str):
|
||||||
try:
|
try:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user