sqlite查询失败,显示“错误:没有这样的列”

时间:2018-02-09 18:53:57

标签: bash sqlite

我有以下数据库:

lab-1:~# sqlite3 /etc/ppd/page.db "select * from users"
John|Doe|Test|0||1|1234|6988|sip
Jane|Doh|test|0||3|6878|123@abc.com|smtp
lab-1:~# sqlite3 /etc/ppd/page.db ".schema"
CREATE TABLE users(fname varchar(100), lname varchar(100), description varchar(100),grp INTEGER, group_name varchar(100), destination_id varchar(100), p_number varchar(10), destination varchar(100), class varchar(10));

这项工作

以下查询通过bash脚本

可以解决问题
lab-2:/tmp# ssh root@lab1.mydomain.net "sqlite3 /etc/ppd/page.db 'SELECT COUNT(*) FROM users WHERE destination='6981' AND p_number='9999''"                                                                                                                                       
0
lab-2:/tmp#

它正确返回0的计数。

此失败

但是当尝试根据fname字段进行查询时......就像炸弹一样:

lab-2:/tmp# ssh root@lab1.mydomain.net "sqlite3 /etc/ppd/page.db 'SELECT COUNT(*) FROM users where fname='John''"
Error: no such column: John

只是想知道你是否能看到我的错字/错误。尝试使用引号与单引号...并尝试添加“\”以逃避select语句周围的引号...但到目前为止,我还没有想出来。

感谢。

编辑1

这就是我所做的向自己证明我有匹配的引号/我没有错过任何引号 - 我这样列出了我的查询:

"
    sqlite3 /etc/ppd/page.db 
        '
            SELECT COUNT(*) FROM users where fname='
                                                    John
                                                   '
        '
"

2 个答案:

答案 0 :(得分:1)

你试图嵌套单引号,但它不能那样工作。在您的第一个(“工作”)示例中,您的shell会看到代表您的查询的五个字符串。这些是:

'SELECT COUNT(*) FROM users WHERE destination='
6981
' AND p_number='
9999
''

由于没有空格将它们分开,所以它们将它们组合成一个传递给sqlite的参数:

SELECT COUNT(*) FROM users WHERE destination=6981 AND p_number=9999

这完全有效。但是,在第二个示例中,shell会看到这三个字符串:

'SELECT COUNT(*) FROM users where fname='
John
''

当合并在一起时,这些产量:

SELECT COUNT(*) FROM users where fname=John

由于John周围没有任何引号,sqlite认为这是一个列名并相应地抱怨。

你需要找到一种合适的方法来逃避最里面的引号,以便它们能够在shell中存活并传递给sqlite。

答案 1 :(得分:0)

将select语句周围的单引号更改为双引号...并将其转义。

lab-1:/tmp# ssh root@lab1.mydomain.net "sqlite3 /etc/ppd/page.db \"SELECT COUNT(*) FROM users where fname='John'\""