Python与Sqlite:因语法错误无法执行查询

1 投票
2 回答
834 浏览
提问于 2025-04-17 17:30

我有一个装满数据的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 [..]

.

撰写回答