You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用jq将嵌套数据库Schema转为扁平化命令序列

用jq实现数据库Schema到扁平化命令序列的转换

核心思路

对每个表,先生成一条TABLE类型命令,再生成该表所有列对应的COLUMN类型命令,最后将每个表的命令数组展开为顶层元素,实现扁平化输出。

示例输入

假设你的数据库Schema JSON结构如下:

{
  "db": {
    "tables": [
      {
        "name": "users",
        "comment": "用户表",
        "cols": [
          {
            "name": "id",
            "type": "INT",
            "primary": true
          },
          {
            "name": "username",
            "type": "VARCHAR(50)"
          }
        ]
      },
      {
        "name": "posts",
        "cols": [
          {
            "name": "post_id",
            "type": "INT"
          },
          {
            "name": "user_id",
            "type": "INT"
          }
        ]
      }
    ]
  }
}

实现命令

使用以下jq命令即可完成转换:

.db.tables[] as $table | [
  # 生成TABLE类型命令
  {
    "type": "TABLE",
    "table_name": $table.name,
    "comment": $table.comment // ""
  },
  # 生成当前表所有列的COLUMN类型命令
  ($table.cols[] | {
    "type": "COLUMN",
    "table_name": $table.name,
    "column_name": .name,
    "data_type": .type,
    "primary": .primary // false
  })
] | flatten

命令解释

  • $table变量:保存当前遍历的表对象,确保列命令能正确关联所属表名,解决上下文丢失问题。
  • //操作符:处理可选字段,当原数据中没有comment或primary时,用空字符串或false作为默认值,避免输出null。
  • flatten:将每个表对应的命令数组展开,让所有TABLE和COLUMN命令处于同一层级。

示例输出

执行命令后会得到如下扁平化的命令序列:

[
  {
    "type": "TABLE",
    "table_name": "users",
    "comment": "用户表"
  },
  {
    "type": "COLUMN",
    "table_name": "users",
    "column_name": "id",
    "data_type": "INT",
    "primary": true
  },
  {
    "type": "COLUMN",
    "table_name": "users",
    "column_name": "username",
    "data_type": "VARCHAR(50)",
    "primary": false
  },
  {
    "type": "TABLE",
    "table_name": "posts",
    "comment": ""
  },
  {
    "type": "COLUMN",
    "table_name": "posts",
    "column_name": "post_id",
    "data_type": "INT",
    "primary": false
  },
  {
    "type": "COLUMN",
    "table_name": "posts",
    "column_name": "user_id",
    "data_type": "INT",
    "primary": false
  }
]

扩展说明

如果你的Schema包含其他字段(比如表的存储引擎、列的可空性等),只需在对应的命令对象中添加字段映射即可。例如要给TABLE命令加engine字段,只需修改TABLE部分:

{
  "type": "TABLE",
  "table_name": $table.name,
  "comment": $table.comment // "",
  "engine": $table.engine // "InnoDB"
}

内容的提问来源于stack exchange,提问作者Adrian Föder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:27:23