在使用 python 2.6.4 中的 sqlite3 标准库时,以下查询可以在 sqlite3 命令行中正常工作:
select segmentid, node_t, start, number,title from
((segments inner join position using (segmentid))
http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;
left outer join titles using (legid, segmentid))
left outer join numbers using (start, legid, version);
但是,如果我通过 python 中的 sqlite3 库执行它,就会收到一个错误:
>>> conn=sqlite3.connect('data/test.db')
>>> conn.execute('''select segmentid, node_t, start, number,title from
((segments inner join position using (segmentid)) left outer join titles using
(legid, segmentid)) left outer join numbers using (start, legid, version)''')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
sqlite3.OperationalError: cannot join using column start - column not present
in both tables
尽管连接查询左侧的(计算的)表似乎具有相关列,因为如果我单独检查它,我得到的结果是:
>>> conn.execute('''select * from ((segments inner join position using
(segmentid)) left outer join titles using
(legid, segmentid)) limit 20''').description
(('segmentid', None, None, None, None, None, None), ('html', None, None, None,
None, None, None), ('node_t', None, None, None, None, None, None), ('legid',
None, None, None, None, None, None), ('version', None, None, None, None, None,
None), ('start', None, None, None, None, None, None), ('title', None, None,
None, None, None, None))
我的数据库架构如下:
CREATE TABLE leg (legid integer primary key, t char(16), year char(16),
no char(16));
CREATE TABLE numbers (number char(16), legid integer, version integer, start integer,
end integer, prev integer, prev_number char(16), next integer,
next_number char(16), primary key (number, legid, version));
CREATE TABLE position (segmentid integer, legid integer, version integer, start integer,
primary key (segmentid, legid, version));
CREATE TABLE 'segments' (segmentid integer primary key, html text, node_t integer);
CREATE TABLE titles (legid integer, segmentid integer, title text, primary key (legid, segmentid));
CREATE TABLE versions (legid integer, version integer, primary key (legid, version));
CREATE INDEX idx_numbers_start on numbers (legid, version, start);
我困惑于我做错了什么。我已经尝试退出/重新启动 python 和 sqlite 命令行,但仍然看不到我做错了什么。这可能非常明显。
2、解决方案
使用 python 库解决我这个问题的方法似乎是引入一个完全虚假的表名:
SELECT legid, version, segmentid, html, node_t, start, number, title
from ((segments inner join position using (segmentid))
left outer join titles using (legid, segmentid)) as LT
left outer join numbers using (start, legid, version);
我认为这会强制 sqlite 收集左侧连接查询的名称,其中一个名称是 "start",然后为最外层连接查询提供了可操作的某些内容。这对我来说有效——升级可能会引入更多问题而不是消除问题,但我会在问题出现时解决它。