如何使用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
相关产品推荐
相关产品推荐

