首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sqlite查询失败,出现"Error: no此类列“

sqlite查询失败,出现"Error: no此类列“
EN

Stack Overflow用户
提问于 2018-02-09 18:53:57
回答 2查看 372关注 0票数 0

我有以下数据库:

代码语言:javascript
复制
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脚本,下面的查询没有问题

代码语言:javascript
复制
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字段查询时..。它会爆炸,像这样

代码语言:javascript
复制
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

这就是我向自己证明的,我有匹配的引号/我没有遗漏任何引号--我的查询如下所示:

代码语言:javascript
复制
"
    sqlite3 /etc/ppd/page.db 
        '
            SELECT COUNT(*) FROM users where fname='
                                                    John
                                                   '
        '
"
EN

回答 2

Stack Overflow用户

发布于 2018-02-09 19:32:17

你想套牢单引号,但不是那样的。在您的第一个示例(“工作”)中,您的shell看到五个字符串表示您的查询。它们是:

代码语言:javascript
复制
'SELECT COUNT(*) FROM users WHERE destination='
6981
' AND p_number='
9999
''

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

代码语言:javascript
复制
SELECT COUNT(*) FROM users WHERE destination=6981 AND p_number=9999

这是完全正确的。但是,在第二个示例中,shell可以看到以下三个字符串:

代码语言:javascript
复制
'SELECT COUNT(*) FROM users where fname='
John
''

当混合在一起时,这些屈服:

代码语言:javascript
复制
SELECT COUNT(*) FROM users where fname=John

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

您将需要找到一种适当的方法来逃避最里面的引号,这样它们才能在外壳中存活下来,并被传递到sqlite中。

票数 1
EN

Stack Overflow用户

发布于 2018-02-09 19:31:28

将select语句周围的单引号更改为双引号.然后逃了出来。

代码语言:javascript
复制
lab-1:/tmp# ssh root@lab1.mydomain.net "sqlite3 /etc/ppd/page.db \"SELECT COUNT(*) FROM users where fname='John'\"" 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48712343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档