我正在试图弄清楚如何在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
我不明白。
此外,我无法获取(例如)所有行的所有第一个条目。为了达到这个目的,我似乎需要循环遍历我想要的条目。
有人可以澄清我做错了什么或者这是如何运作的?
问候!
答案 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 ] )