使用Flyway CLI执行正式迁移前如何检测是否存在待执行的迁移任务
方案1:使用结构化输出参数(最可靠)
Flyway v6及以上版本原生支持指定输出格式,你只要在info命令前加上-outputType=json参数,就可以直接输出结构化的JSON格式结果,完全不需要解析杂乱的文本表格。
修改后的示例命令如下:
flyway -locations="filesystem:schema_migration_files" \ -user="userxyz" \ -password="lsdkfklsdfjld" \ -url=jdbc:postgresql://myserver:5432/mydb \ -outputType=json \ info
你可以配合jq工具在脚本中快速判断是否有待执行迁移,参考脚本片段:
# 执行flyway info并将结果存为变量 flyway_output=$(flyway -outputType=json [你的其他参数] info) # 判断是否存在PENDING状态的迁移 has_pending=$(echo "$flyway_output" | jq '.migrations[] | select(.state == "PENDING")' | wc -l) if [ $has_pending -gt 0 ]; then echo "存在待执行迁移" # 你后续的迁移逻辑 else echo "无待执行迁移" fi
这个方案完全规避了文本误匹配的问题,可靠性最高。
方案2:文本匹配(仅临时使用)
如果你暂时无法使用JSON输出,也可以优化文本匹配逻辑降低误判概率:不要直接匹配全局的"Pending"字符串,而是匹配开头带状态列、状态为Pending的行,比如可以用grep匹配^[[:space:]]*|[[:space:]]*Pending[[:space:]]*|格式的行,这种匹配基本可以避开迁移描述里带Pending的极端情况,可靠性也足够大多数场景使用。
内容的提问来源于stack exchange,提问作者red888
相关产品推荐
相关产品推荐

