搜索由句子

时间:2015-05-04 03:51:26

标签: python string sqlite

我在JetBrains PyCharm Community Edition 4.0.4中使用SQLite3和python。

我有一张看起来像这样的桌子。 ID是整数,名称和内容是文本。

ID Name Content
1  Matt oirefasd aifsfnib if ib @John sefuhrg wefirwgf
2  John sdfwre frwgfwg wegfhtr @Patsfrwg
3  Pat  asjgre wurgjnsow wouregjeo @Johnsfbwufaeovnwo
4  John sfgoe eriogner weogfib

所以这是我的问题, 假设用户John已登录。如何编写sqlite查询,以便我收到包含以@符号开头的消息的行,后跟内容列中登录的用户(John)。

我应该以元组的形式收到答案。(ID,姓名,内容)

所以解决方案应该是:

ID Name Content
1  Matt oirefasd aifsfnib if ib @John sefuhrg wefirwgf
3  Pat  asjgre wurgjnsow wouregjeo @Johnsfbwufaeovnwo 

这是我当前的SQL查询。 currentuser存储当前登录用户的名称,本例为John。

str = '%'+ currentuser + '%'
c = db.cursor()
sql = "SELECT id, Name, content FROM myusers WHERE myusers.content LIKE ? LiMIT ?"
c.execute(sql,(str,limit))
return [x[0] for x in c]

我一直收到一条错误,上面写着“'int'对象不可订阅”

上面的代码是针对我的单元测试语句进行测试的。这句话是:

self.assertListEqual([1, 3], [a[0] for a in posts])

2 个答案:

答案 0 :(得分:0)

您的问题是这样的一行:

self.assertListEqual([1, 3], [p[0] for p in posts]) 

这不是你向我们展示的任何代码。但据推测,posts是您问题中代码返回的列表。 posts是一个整数列表,例如[1, 3],因此每个p都是一个整数,因此每个p[0]都会引发异常,因为你要求的是1[0],这没有任何意义。

我想你只想要assertListEqual([1, 3], posts)

答案 1 :(得分:0)

如果仔细观察,我会被要求返回元组。 和 如果查看单元测试语句assertListEqual([1, 3], [a[0] for a in posts]),则表示您正在比较两个列表的值。

因此,解决方案在于随问题提供的代码。

而不是使用此

return [x[0] for x in c]

返回每行的第一个元素。我用这句话:

return [x for x in c]

返回元组。

现在,当assert语句应用于返回两个元组的a [0]元素的元组时,在这种情况下它是[1,3]。测试通过。