如何合并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命令执行状态,明确告知操作结果。
原合并失败的常见原因
- 未处理列已存在的场景:重复执行时会抛出
duplicate column name错误,导致脚本中断。 - here-doc格式问题:合并时若缩进或引号处理不当,会导致SQL命令无法被正确解析执行。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

