

MySQL 查询输出的数据看起来“不干净”,通常是因为影刀在执行 SQL 语句后,返回的是 Python 原生对象类型。例如,数值字段可能显示为 Decimal('10.00'),日期字段显示为 datetime.datetime(2023, 1, 1, 0, 0)。
要解决这个问题,您可以采用以下几种方法来清洗和格式化数据:
在“执行SQL”指令的高级配置中(标准指令的其他指令里面的,见文末),您可以勾选“是否以文本格式返回查询结果”。
不勾选(默认):返回的是列表嵌套列表(二维数组),如 [[val1, val2], [val3, val4]]。
勾选:返回的是列表嵌套字典,如 [{"列名1": val1, "列名2": val2}]。这在处理特定列数据时更方便。
需要配合连接数据库指令【不推荐】


这是最彻底的解决方法。通过一段简单的 Python 代码,将 Decimal 转换为浮点数或字符串,将 datetime 转换为标准日期字符串。
操作步骤:
在流程中添加“执行Python代码”指令。
传入 SQL 查询的结果变量(假设变量名为 sql_data)。
使用以下代码进行转换:
import datetime
from decimal import Decimal
def clean_sql_data(data):
if not data:
return data
cleaned_data = []
for row in data:
new_row = {} if isinstance(row, dict) else []
# 处理字典格式
if isinstance(row, dict):
for k, v in row.items():
if isinstance(v, Decimal):
new_row[k] = float(v) # 转换为浮点数
elif isinstance(v, datetime.datetime):
new_row[k] = v.strftime('%Y-%m-%d %H:%M:%S') # 转换为字符串
else:
new_row[k] = v
# 处理列表格式
else:
for v in row:
if isinstance(v, Decimal):
new_row.append(float(v))
elif isinstance(v, datetime.datetime):
new_row.append(v.strftime('%Y-%m-%d %H:%M:%S'))
else:
new_row.append(v)
cleaned_data.append(new_row)
return cleaned_data如果您需要将数据写入 Excel 或进行进一步分析,建议使用影刀的 DataFrame(数据表格) 扩展指令:
1.使用“创建DataFrame”指令将 SQL 结果转换为表格对象。

使用之前的效果

使用之后的效果

2.使用“df列转时间格式”或相关转换指令统一格式。

3.DataFrame 在写入 Excel 时会自动处理大部分 Python 原生类型的转换,使结果更整洁。
如果不想在影刀中处理,也可以在 MySQL 查询语句中使用 CAST、CONVERT 或 DATE_FORMAT 函数:
日期格式化:SELECT DATE_FORMAT(column_name, '%Y-%m-%d %H:%i:%s') FROM table
数值格式化:SELECT CAST(column_name AS CHAR) FROM table(转为字符串)或 SELECT column_name + 0 FROM table(强制转为普通数字)
注意这几个指令的区别

相关文档: