Golang通过exec.Command调用sqlite3无输出无报错如何解决?
问题原因
Go的exec.Command不会调用系统shell解析命令,你传入的每一个参数会原封不动传递给目标程序,不需要额外加引号,也不能把多个命令行参数拼接成一个字符串传入。
你原来的写法把数据库路径和查询语句拼成了单个字符串,还额外加了单引号、前导空格,相当于给sqlite3传递的参数只有一个: /home/chadg/Downloads/testDb.db 'select * from testTable;',sqlite3会把整个字符串当作数据库文件名去查找,自然找不到对应库,也没有收到要执行的SQL语句参数,所以没有输出也没有报错。
你看到的cmd.String()打印结果和手动执行的命令一致,只是该方法为了方便调试模拟了shell命令的格式,不代表实际传给子进程的参数结构。
解决方法
把所有命令行参数拆成独立的字符串传入,不需要加任何引号,去掉数据库路径前多余的空格即可:
func sqliteTest(){ cmd:=exec.Command("/usr/bin/sqlite3", "/home/chadg/Downloads/testDb.db", "select * from testTable;") fmt.Println("Command String:",cmd.String()) out,err:=cmd.CombinedOutput() if err!=nil{ fmt.Println("Error Accessing Database:",err.Error(),string(out)) return } fmt.Println("Result Length:",len(out)) fmt.Println("Result:",string(out)) }
内容的提问来源于stack exchange,提问作者Chad G
相关产品推荐
相关产品推荐

