【问题标题】:Why does this sqlite3 command work interactively but not in batch?为什么这个 sqlite3 命令以交互方式工作而不是批量工作?
【发布时间】:2014-11-19 16:57:21
【问题描述】:

我想创建一个批处理脚本来从我的数据库中删除所有记录。

如果我启动命令行界面,我没有问题:

[tomcat@scsrv26v pycsw]$ sqlite3 /var/www/pycsw/tests/suites/cite/data/records.db
SQLite version 3.6.20
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> delete from records;
sqlite> .quit

但如果我尝试从批处理中运行它,它不起作用:

#!/bin/bash
sqlite3 -batch /var/www/pycsw/tests/suites/cite/data/records.db <<"EOF"
delete from records;
.quit
EOF

这是我得到的错误:

Error: near line 1: no such table: records

知道问题出在哪里吗?

【问题讨论】:

  • 我不是 sqllite 用户,但我猜您在 delete 命令之前需要等效于 use correctTableSpace; 的内容。祝你好运。
  • 对我有用 /tmp 中的文件。您能否创建一个我们可以使用的最小可演示示例?
  • 您是否以同一用户在同一台​​机器上运行批处理文件?
  • 是的,我都以同一个用户的身份运行。

标签: bash sqlite


【解决方案1】:

这是我第一次看到指示的语法。抱歉,我不知道它是如何工作的。

但这可以通过((我在 Windows 批处理文件中使用它,据我所知在 linux 中也使用):

直接从命令行命令

sqlite3 records.db 'delete from records'

通过管道传输到 sqlite 的命令

echo delete from records; | sqlite3 records.db 

当然,您可以将命令放在文件中并重定向到 sqlite

sqlite3 records.db < myCommands.sql

【讨论】:

  • @IngoBürk,不,正如我第一次看到这种命令行语法。但是看起来很有趣,当我试图找到原因(并尝试一种新的语法)时,我发布了一个解决该问题的方法。这是不可接受的吗?
  • 但解决方法不是所要求的。 OP 非常清楚地表明他们可以通过 CLI 使其工作。
  • @IngoBürk,OP 从交互式 sqlite 提示符中展示了操作工作。 OP 尝试使其在批处理模式下工作失败。我发布的代码处理批处理模式,可以用作替代解决方案或附加测试,同时检测问题所在。
【解决方案2】:

可能与 .db 文件参数的路径有关(请参阅 No Such Table error)。如果 .db 不存在,则将其创建为空 db 文件。

要测试,看看这是否有效:

#!/bin/bash
sqlite3 -batch tests/suites/cite/data/records.db <<"EOF"
select count(*) from records;
.quit
EOF

话虽如此,这对我有用:

$ sqlite3 --version
3.8.7.1 2014-10-29 13:59:56 3b7b72c4685aa5cf5e675c2c47ebec10d9704221
$ sqlite3 tests/suites/cite/data/records.db "delete from records"

【讨论】:

  • 你建议的 bash 脚本给了我同样的错误。我将使用 MC ND 提出的单线(并且您已确认!),因为它解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多