0

如果在执行我的 sql crud 操作期间出现问题,或者如果它无法使用 shell 脚本进行提交,我正在尝试回滚。

我有 test2.sh 和 test.sh test.sh:

 #!/bin/sh
 sqlite3 dB.sqlite << EOF
 begin;
 select * from Table1; 

和 test2.sh

#!/bin/sh
if echo `./test.sh`|grep -q "SQL error"; then
  rollback;
else
  err=commit;
  if echo $err |grep -q "error"; then
    rollback;
  fi
fi

没有名为 Table1 的表,我希望得到 test.sh 的 sql 错误输出和回滚。

但它给出了错误:回滚:找不到命令。我怎样才能得到错误并进行回滚?还是我遵循的这种方式对吗?

4

1 回答 1

1

您的 test2.sh 脚本失败,因为 shell 试图执行一个名为 的程序rollback,因此“找不到命令”。您想使用sqlite 指令回滚,这意味着您至少必须这样做:

sqlite3 dB.sqlite << EOF
rollback;
EOF

但我认为这行不通。正如我所看到的,回滚必须发生在与 test.sh 启动的相同的 sqlite 会话中才能产生任何效果。您的 test.sh 脚本已经使 sqlite 遍历命令,直到它到达 EOF,当您使用 test2.sh grep 错误时,已经太晚了。您无法从位于该 sqlite 会话之外的 test2.sh 脚本进行回滚。

因此,为了完成我的回答,我建议您远离 Bash 脚本并使用一种编程语言,这将允许您打开一个 sqlite 会话、执行命令和控制事务。Python中的快速示例:

import sqlite3

conn = sqlite3.connect('dB.sqlite')

c = conn.cursor()

try:
    c.execute('INSERT INTO Table1 VALUES(1)')
    conn.commit()
except:
    conn.rollback()

c.close()
于 2013-04-25T13:55:22.160 回答