Python SQlite ORDER BY命令不起作用

时间:2013-04-24 22:17:49

标签: python sql sqlite sql-order-by

我刚开始使用programmming并使用sqlite3在pyscripter中编写了几行代码。

预先创建表“gather”。然后,我从“聚集”中选择某些行,将它们放入另一个表中。我尝试按特定列'日期'对此表进行排序。但它似乎没有用。它没有给我一个错误信息或类似的东西。它只是没有排序。如果我在sqlitemanager中尝试相同的命令(SELECT * FROM匹配ORDER BY日期),它在完全相同的表上工作正常!这里有什么问题?我用谷歌搜索了一段时间,但我没有找到解决方案。这可能是我想念的愚蠢......

正如我所说,我是一个全新的人。我猜你们都在流泪看着代码。所以,如果你有任何提示,我可以如何缩短代码或使其更快或更快,你非常欢迎:)(但除了上面提到的部分,一切正常。)

import sqlite3
connection = sqlite3.connect("gather.sqlite")
cursor1 = connection.cursor()
cursor1.execute('Drop table IF EXISTS matches')
cursor1.execute('CREATE TABLE matches(date TEXT, team1 TEXT, team2 TEXT)')
cursor1.execute('INSERT INTO matches (date, team1, team2) SELECT * FROM gather WHERE team1=? or team2=?, (a,a,))

cursor1.execute("SELECT * FROM matches ORDER BY date")


connection.commit()

2 个答案:

答案 0 :(得分:0)

尝试在commit之前移动SELECT *(我不确定100%这是一个问题)然后您只需要获取查询结果:-)添加一行像在res = cursor1.fetchall() execute之后SELECT。如果要像sqlitemanager一样显示它们,请添加

for hit in res:
    print '|'.join(hit)

在底部。

修改:解决将排序顺序存储到表中的问题:

我认为你所寻找的东西就像聚集索引。 (实际上并没有对表中的值进行排序,而是接近;请参阅here)。

SQLIte没有这样的索引,但您可以通过实际排序表来模拟它们。您只能在插入数据时执行此操作一次。您需要一个SQL命令,如下所示:

INSERT INTO matches (date, team1, team2) 
    SELECT * FROM gather 
    WHERE team1=? or team2=? 
    ORDER BY date;

而不是您当前使用的那个。

见第4点here,这是我明白的地方。

答案 1 :(得分:0)

好的,我想我理解你的问题。首先:我不确定是否有必要提交调用。但是,如果是,您肯定希望它在您的select语句之前。 'connection.commit()'实质上是说,提交我刚刚对数据库所做的更改。

您的第二个问题是您正在执行选择查询,但实际上从未对查询结果做任何事情。

试试这个:

import sqlite3
connection = sqlite3.connect("gather.sqlite")
cursor1 = connection.cursor()
cursor1.execute('Drop table IF EXISTS matches')
cursor1.execute('CREATE TABLE matches(date TEXT, team1 TEXT, team2 TEXT)')
cursor1.execute('INSERT INTO matches (date, team1, team2) SELECT * FROM gather WHERE team1=? or team2=?, (a,a,))

connection.commit()

# directly iterate over the results of the query:
for row in cursor1.execute("SELECT * FROM matches ORDER BY date"):
    print row

您正在执行查询,但从未实际检索过结果。使用sqlite3有两种方法:一种方法是我在上面展示的方式,你可以直接使用execute语句作为可迭代对象。

另一种方式如下:

import sqlite3
connection = sqlite3.connect("gather.sqlite")
cursor1 = connection.cursor()
cursor1.execute('Drop table IF EXISTS matches')
cursor1.execute('CREATE TABLE matches(date TEXT, team1 TEXT, team2 TEXT)')
cursor1.execute('INSERT INTO matches (date, team1, team2) SELECT * FROM gather WHERE team1=? or team2=?, (a,a,))

connection.commit()

cursor1.execute("SELECT * FROM matches ORDER BY date")

# fetch all means fetch all rows from the last query.  here you put the rows
# into their own result object instead of directly iterating over them.
db_result = cursor1.fetchall() 
for row in db_result:
    print row