(self, config: dict, context: ExecutionContext)
| 84 | return "db_query" |
| 85 | |
| 86 | async def execute(self, config: dict, context: ExecutionContext) -> ModuleResult: |
| 87 | connection_name = context.resolve_value(config.get('connectionName', 'default')) |
| 88 | sql = context.resolve_value(config.get('sql', '')) |
| 89 | variable_name = context.resolve_value(config.get('variableName', '')) |
| 90 | single_row_raw = config.get('singleRow', False) |
| 91 | # 支持变量引用 |
| 92 | if isinstance(single_row_raw, str): |
| 93 | single_row_raw = context.resolve_value(single_row_raw) |
| 94 | single_row = single_row_raw in [True, 'true', 'True', '1', 1] |
| 95 | |
| 96 | connections = get_db_connections(context) |
| 97 | conn = connections.get(connection_name) |
| 98 | |
| 99 | if not conn: |
| 100 | return ModuleResult( |
| 101 | success=False, |
| 102 | error=f"数据库连接 '{connection_name}' 不存在,请先使用「连接数据库」模块" |
| 103 | ) |
| 104 | |
| 105 | if not sql: |
| 106 | return ModuleResult(success=False, error="SQL语句不能为空") |
| 107 | |
| 108 | try: |
| 109 | with conn.cursor() as cursor: |
| 110 | cursor.execute(sql) |
| 111 | if single_row: |
| 112 | result = cursor.fetchone() |
| 113 | else: |
| 114 | result = cursor.fetchall() |
| 115 | |
| 116 | # 保存到变量 |
| 117 | if variable_name: |
| 118 | context.variables[variable_name] = result |
| 119 | |
| 120 | row_count = 1 if single_row and result else len(result) if result else 0 |
| 121 | |
| 122 | return ModuleResult( |
| 123 | success=True, |
| 124 | message=f"查询成功,返回 {row_count} 条记录", |
| 125 | data={"rowCount": row_count, "data": result} |
| 126 | ) |
| 127 | except Exception as e: |
| 128 | return ModuleResult(success=False, error=f"查询失败: {str(e)}") |
| 129 | |
| 130 | |
| 131 | @register_executor |
no test coverage detected