我会尽量做到尽可能明确。我是Db的新人。
OS = Windows 7
Python ver = 2.7.10
SQLite ver = 3.8.11.1
我在SQLite DB中有以下表格:
CREATE TABLE job_logs(ID INTEGER PRIMARY KEY, eventcount INTEGER NOT NULL,
content TEXT, timestamp CHAR(25) NO NULL);
表格如下:
1 | 1 | blabblablabla..blab | Mon May 15 07:22:59 2006
1 | 2 | blabblablabla..blab | Mon May 15 09:22:30 2006
...
2 | 1 | blabblablabla..blab | Mon May 20 07:22:59 2006
2 | 2 | blabblablabla..blab | Mon May 21 09:26:00 2006
..
我想检索ID = 301的第一个和最后一个eventcount的时间戳。
在sqlite3 shell中,我输入了以下查询,并得到了正确的值:
sqlite>SELECT ID, min(eventcount), timestamp FROM job_logs WHERE ID = 301;
301|1| Mon May 15 07:22:59 2006
sqlite>SELECT ID, max(eventcount), timestamp FROM job_logs WHERE ID = 301;
301|52| Mon Jun 5 16:04:12 2006
确定。所以我写了下面的python脚本,但是没有得到相同的结果:
import sqlite3
db_dir = <db location>
db = sqlite3.connect(db_dir)
cursor = db.cursor()
cursor.execute("SELECT ID, min(eventcount), timestamp FROM job_logs WHERE ID = 301;")
min = cursor.fetchone()
print min
(301, 1, u'Mon Jun 5 16:04:12 2006')
cursor.execute("SELECT ID, max(eventcount), timestamp FROM job_logs WHERE ID = 301;")
max = cursor.fetchone()
print max
(301, 52, u'Mon Jun 5 16:04:12 2006')
正如您所看到的,两个查询返回的时间戳值都是max(eventcount),这就是问题所在。
这是我第一次看到这种行为。请注意,eventcount值是正确的,只有timestamp值是错误的。我验证了数据库,一切似乎都很好,如果我在SQLite shell上运行查询,db会给我正确的结果。
另外,我尝试了这个查询,但结果相同:
cursor.execute("SELECT ID, min(eventcount), timestamp FROM job_logs WHERE ID = 301 GROUP BY ID;")