索引Python fetchall()

时间:2016-04-01 10:46:47

标签: python mysql

我正在试图弄清楚如何在MySQL中使用Python。我在查询查询结果中的条目时遇到了问题。

所以,如果我做这样的事情:

import MySQLdb

db = MySQLdb.connect(host="192.168.178.10",
                     user="user",
                     passwd="password",
                     db="testdb")

cur = db.cursor()

cur.execute("select * from Persons;")
print(cur.fetchall()[2][2])


db.close()

我得到了第三行的第三个条目似乎是合理的。

如果我这样做:

print(cur.fetchall()[0][0:2])

我得到了第一行的第一个条目。这似乎也是合理的。

但是,如果我这样做:

print(cur.fetchall()[0:2][2])

我收到错误:

Traceback (most recent call last):
  File "mysql.py", line 19, in <module>
    print(cur.fetchall()[0:2][2])
IndexError: tuple index out of range

我不明白。

此外,我无法获取(例如)所有行的所有第一个条目。为了达到这个目的,我似乎需要循环遍历我想要的条目。

有人可以澄清我做错了什么或者这是如何运作的?

问候!

2 个答案:

答案 0 :(得分:0)

首先,如果没有指定的顺序,则不会使用

获得“第三行”
cur.execute("select * from Persons;")
print(cur.fetchall()[2][2])

你得到一个随机的行。它似乎足够稳定,但不要相信它。

获得IndexError: tuple index out of range的原因是

print(cur.fetchall()[0:2][2])

从结果集中取一个0到1的元素,然后尝试将第3个元素与[2]一起使用,这不存在,因为你的切片有2个元素。

E.g。

In [1]: rows = tuple(zip(range(10), range(10)))

In [2]: rows
Out[2]: 
((0, 0),
 (1, 1),
 (2, 2),
 (3, 3),
 (4, 4),
 (5, 5),
 (6, 6),
 (7, 7),
 (8, 8),
 (9, 9))

In [3]: rows[0:2]
Out[3]: ((0, 0), (1, 1))

In [4]: rows[0:2][0]
Out[4]: (0, 0)

In [5]: rows[0:2][2]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-5-2b13f1394ba3> in <module>()
----> 1 rows[0:2][2]

IndexError: tuple index out of range

要从结果元组中实际获取第3个属性,您可以使用例如map或列表推导:

In [6]: rows = tuple(zip(range(10), range(10), range(10,20)))

In [7]: [r[2] for r in rows[0:2]]
Out[7]: [10, 11]

答案 1 :(得分:0)

使用索引范围查询时,列表元素的元组返回另一组元素列表元组。

>>> t = ([1,2,3],[4,5,6],[7,8,9],)
>>> print( t[0:2] ) # 2 is number of lists in the resulting tuple
([1, 2, 3], [4, 5, 6])

在这里你可以观察到结果元组大小是2个元素。索引只能是0和1。因此以下声明失败。

>>> print( t[0:2][2] ) # [2] is pointing to non existing index
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
>>>

正确的陈述可以是这个。

>>> print( t[0:2][1] )
[4, 5, 6]

如果我理解正确,您的目的是从提取的数据集的前两行中找到第二列值。可能的陈述可以是:

>>> for x in t[0:2]: print (x)
...
[1, 2, 3]
[4, 5, 6]
>>>
>>> for x in t[0:2]: print (x[2])
...
3
6
>>>

因此,声明

print(cur.fetchall()[0:2][2])

可以重写为:

rows = cur.fetchall()[ 0:2 ]
for row in rows: print ( row[ 2 ] )