mysql无法直接导出yaml,需通过mysqldump生成sql/json再转yaml;推荐python+pyyaml方案,注意时区、类型映射、大表分页及语义注释。
mysql 数据不能直接导出为 yaml —— 没有内置命令或标准工具支持这种格式转换,必须经由中间层处理。
用 mysqldump + 脚本转 YAML 最可靠
MySQL 自身不生成 YAML,mysqldump 只能输出 SQL 或 CSV。想得到 YAML,得先取结构化数据(比如 JSON),再转一次。最稳的路径是:mysqldump --skip-extended-insert --compact -t -c db table | mysqljson(或用 Python/Node.js 读结果)→ JSON → YAML。
- 别用
SELECT ... INTO OUTFILE直接写 YAML:权限受限、无格式控制、易注入 - 推荐用 Python 的
mysql-connector-python+PyYAML,可控字段顺序、空值处理、嵌套逻辑 - 导出前加
SET SESSION time_zone = '+00:00',避免时间字段在 YAML 里变成带时区字符串,CI/CD 环境容易解析失败
字段类型不匹配会导致 YAML 解析失败
YAML 对布尔、数字、null 敏感,而 MySQL 的 TINYINT(1) 常被当布尔用,但导出成 JSON 后是 1 或 0,PyYAML 默认不转成 true/false;NULL 变成 null 是对的,但某些 CI 工具(如 Ansible)会把 null 当缺失键处理。
- 导出脚本里显式映射:把
1/0转成True/False,None保留为None(PyYAML 会序列化为null) - 字符串字段强制调用
str(),防止数字型 ID(如BIGINT)在 YAML 里被误识别为整数,后续被 CI 工具当作非字符串处理 - 时间字段统一转为 ISO 8601 字符串(
2024-05-22T10:30:00Z),别留datetime对象,PyYAML 默认不序列化它
大表导出 YAML 会卡住或 OOM
YAML 不适合存千行以上数据:缩进敏感、解析慢、Git diff 不友好。CI/CD 测试数据通常只需几十行,真要导全量,说明设计有问题。
- 用
WHERE限定范围:SELECT * FROM users WHERE id IN (1,5,12,99),别导整表 - 分页导出时,用
ORDER BY id LIMIT 100 OFFSET 0,避免LIMIT+OFFSET在大偏移时变慢 - 生成后用
yamllint检查缩进和冒号空格,CI 流程里加一步:yamllint test-data.yaml || exit 1
真正麻烦的不是怎么转,而是字段语义丢失——比如 status 是枚举值,YAML 里只剩 2,没人知道它对应 “pending” 还是 “archived”。这类信息得靠注释或配套 schema 文件补全,自动化流程里常被跳过。










