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

如何合并Bash脚本:检测SQLite表结构后添加新列

解决方案

以下是合并后可正常运行的脚本,同时解决了重复执行时列已存在的报错问题:

#!/bin/bash

# 检测my_data表是否存在
if sqlite3 my.db <<< ".schema my_data" | grep -qi 'create table my_data'; then
    echo "表my_data存在,开始处理列添加..."
    # 执行添加列逻辑,先判断列是否存在再操作
    sqlite3 my.db <<EOS
-- 检查col1是否存在,不存在则添加
SELECT name FROM pragma_table_info('my_data') WHERE name = 'col1';
IF changes() = 0 THEN
    ALTER TABLE my_data ADD col1 JSON DEFAULT '{}' NOT NULL;
END IF;

-- 检查col2是否存在,不存在则添加
SELECT name FROM pragma_table_info('my_data') WHERE name = 'col2';
IF changes() = 0 THEN
    ALTER TABLE my_data ADD col2 REAL DEFAULT 0.0 NOT NULL;
END IF;
EOS
    # 反馈操作结果
    [ $? -eq 0 ] && echo "列操作完成(已存在或成功添加)" || echo "列操作出现错误"
else
    echo "表my_data不存在,跳过列添加"
fi

关键优化点

  • 精准表检测:用.schema my_data替代全局.schema,缩小grep匹配范围,避免误判其他表的CREATE语句。
  • 避免重复添加:通过pragma_table_info查询列是否存在,结合changes()判断结果行数,仅在列不存在时执行ALTER操作,解决重复执行报错问题。
  • 语法修正:REAL类型默认值去掉引号(0.0而非"0.0"),JSON默认值改用单引号,避免与here-doc的双引号冲突。
  • 状态反馈:通过$?获取sqlite3命令执行状态,明确告知操作结果。

原合并失败的常见原因

  1. 未处理列已存在的场景:重复执行时会抛出duplicate column name错误,导致脚本中断。
  2. here-doc格式问题:合并时若缩进或引号处理不当,会导致SQL命令无法被正确解析执行。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:20:08