Python与Sqlite:因语法错误无法执行查询
我有一个装满数据的sqlite数据库,现在我正在写代码来搜索和提取我想要的数据。可是我遇到了一些麻烦:
conn = sqlite3.connect("ensembl.db")
cur = conn.cursor()
...
cur.execute('SELECT b.chr,(b.start-e.start) as StartD, (b.end-e.end) as EndD,b.tcon,b.tname,b.gname FROM ensembl e blast b WHERE b.tcon=? AND b.tname=e.tname AND b.gname=e.gname AND b.chr=e.chr',tcon)
print cur.fetchone()
这段代码返回了一个错误:
File "data.py", line 12, in <module>
cur.execute('SELECT b.chr,(b.start-e.start) as StartD, (b.end-e.end) as EndD,b.tcon,b.tname,b.gname FROM ensembl e blast b WHERE b.tcon=? AND b.tname=e.tname AND b.gname=e.gname AND b.chr=e.chr',tcon)
sqlite3.OperationalError: near "blast": syntax error
我不太明白python提到的这个语法错误是什么——我之前在sqlite和python中做过类似的查询(虽然没有这么复杂),而且都能正常工作。我尝试了各种其他方法,但都没有成功……我是不是漏掉了什么简单的东西?
还有,另一个问题——一旦我把这个问题解决了,最好的方法是什么来单独提取结果中的每一列?我之前用过cur.fetchone(),把它赋值给一个变量,适用于只返回一个结果的查询,但我不确定它是否适用于返回多个结果的查询。
相关问题:
2 个回答
1
要提取某一列的数据,你可以使用一种叫做“映射”的方法,把一个简单的函数应用到一个列表的列表上。比如,如果你想要第一列的数据,可以写成这样:map(lambda x: x[0], listoflist)。如果想要第二列的数据,就改成map(lambda x: x[1], listoflists),以此类推。
你甚至可以创建一个专门做这件事的简单函数,也就是:
extractor = lambda i,l : map(lambda x: x[i],l)
然后使用
extractor(i,listofLists)
就可以得到第i列的数据列表。
2
你需要在FROM部分用逗号把表格分开:
[..] FROM ensembl e, blast b [..]
.