当前位置: 首页 > 知识库问答 >
问题:

运行sqlite3。使用exec进行备份。命令

闻人修明
2023-03-14

我正在尝试使用sqlite3从Go备份一个db。备份命令,按照本SO答案给出的方式执行https://stackoverflow.com/a/25684912/426853.

以下操作始终在命令行中起作用:

sqlite3 /home/pi/pgclogs/smartlog.db备份/home/pi/pgcdata/smartlog.db.bak

我将其编码为Go,如下所示:

func DbBackup() (err error) {
    dbpath := "/home/pi/pgclogs/smartlog.db"
    bakpath := "/home/pi/pgcdata/smartlog.db.bak"
    cmd := exec.Command("sqlite3", dbpath, fmt.Sprintf("\".backup '%s'\"", bakpath))
    out, err := cmd.CombinedOutput()
    if err != nil {
        return fmt.Errorf("dbBackup failed : %s : %v", string(out), err)
    }
    return
} 

我有一个测试文件,像这样调用它:

func TestDbBackup(t *testing.T) {
    var err error
    err = DbBackup()
    if err != nil {
        t.Errorf("backup failed : %v", err)
    }
} 

测试报告了来自sqlite3的语法错误。

--- FAIL: TestDbBackup (0.01s)
    db_backup_test.go:22: backup failed : dbBackup failed : Error: near "".backup '/home/pi/pgcdata/smartlog.db.bak'"": syntax error
         : exit status 1

我怀疑问题出在cmd的方式上。组合输出将参数传递给shell,问题在于fmt中的引用。Sprintf调用。我试着把它改成

fmt.Sprintf(`".backup '%s'"`, bakpath)

但结果是一样的。我还尝试将echo放在命令前面,即exec。命令(“echo”、“sqlite3”、dbpath、…并打印输出。输出看起来绝对正确

sqlite3 /home/pi/pgclogs/smartlog.db ".backup '/home/pi/pgcdata/smartlog.db.bak'"

粘贴到命令行时,它会正确运行。我肯定我忽略了一些简单的事情,但我已经花了一个多小时,仍然没有看到它。

共有1个答案

刘骏祥
2023-03-14

你根本不需要额外的报价,所以这应该可以做到:

exec.Command("sqlite3", dbpath, fmt.Sprintf(".backup '%s'", bakpath))

这些引号由shell解析,这样就可以将. back的'某些文件'作为一个参数传递给sqlite3。使用exec时。命令,不涉及shell,这也是您将命令拆分为多个参数的原因。

 类似资料:
  • 问题内容: 我知道这是内置的shell,我可以使用运行它。 但这有可能由家人来执行命令吗? 编辑:我只是注意到这也是没有意义的。感谢大家的帮助。 问题答案: 加载 可执行文件 并用它替换当前程序映像。正如您正确指出的那样,它 不是 可执行文件,而是内置的shell。因此,您要运行的可执行文件是外壳本身。当然,这对您有帮助,但是如果您想对其进行明确说明,则可以使用: 由于这 将替换 您当前的过程映像

  • 问题内容: 您好,我正在尝试从mysql命令行客户端进行备份。我正在使用mysqldump使用用户名和密码进行备份。以下是我用于备份数据库的命令。 我收到以下错误 尽管该命令似乎是正确的,但仍然出现错误。请让我知道是否还有其他方法可以从mysql命令行进行备份。 提前致谢。 问题答案: 不是MySQL命令,而是命令行实用程序。您必须从Shell命令行调用它。

  • 我需要避免错误,并使用mysqldump将数据库备份存储在单独的文件路径中

  • 我需要用docker exec运行2个命令。我正在从docker容器中复制一个文件,不想处理凭据来使用像ssh这样的东西。此命令复制一个文件: 但它会创建一个子目录var/log,我想避免这种情况,所以如果我可以在docker容器中执行这些操作,我应该很好: 如何让docker exec运行2个命令?

  • 我正在处理我的一个项目。我正在windows机器上使用XAMPP开发该项目。这就是我面临的问题。我需要在服务器上执行shell脚本,并在网页上显示结果。问题是,大多数脚本都按预期运行,但我无法获得以下命令的输出:, ls, cat, pwd 因为这些命令返回给我一个空白数组。 我找不到确切的问题。

  • 我尝试在php中运行curl命令使用exec方法,它在我的Linux服务器中运行良好,但在我的Windows机器中不工作,我也检查了我的PHP配置文件,在那里启用了curl。它不起作用的问题是什么? 我的命令是(一个用于Linux的命令,这个命令在那里成功运行)“curl-u admin:geoserver-XPUT-H”Content type:image/tiff”--data binary@