我在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])
答案 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]。测试通过。