import MySQLdb
conn = MySQLdb.connect(host=‘localhost’, user=‘root’, passwd='123456, db=‘dbname’, charset=‘utf8’)
cursor = conn.cursor()
cursor.execute(sql)
成功result为1;失败为0。
此时,cursor就是一个Cursor对象,这个cursor是一个实现了迭代器(def iter())和生成器(yield)的MySQLdb对象,这个时候cursor中还没有数据,只有等到fetchone()或fetchall()的时候才返回一个元组tuple(我个人认为是fetchall()同时生成器转型为tuple了,可以看下面的代码对比),才支持len()和index()操作,这也是它是迭代器的原因。但同时为什么说它是生成器呢?因为cursor只能用一次,即每用完一次之后记录其位置,等到下次再取的时候是从游标处再取而不是从头再来,而且fetch完所有的数据之后,这个cursor将不再有使用价值了,即不再能fetch到数据了。
import pymysql
# 创建连接对象
conn = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='123456',
database='world',
charset='utf8')
# 获取游标对象
cursor = conn.cursor() # Cursor类的对象
# 查询 SQL 语句
sql = "select * from scores;"
# 执行 SQL 语句 返回值就是 SQL 语句在执行过程中影响的行数
row_count = cursor.execute(sql)
print("SQL 语句执行影响的行数%d" % row_count)
# """cursor.fetchall()的数据类型为tuple,很可疑"""
print(cursor.fetchall())
print(cursor.fetchall())
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
结果为:
SQL 语句执行影响的行数6
((3.5, 1), (3.65, 2), (4.0, 3), (3.85, 4), (4.0, 5), (3.65, 6))
()
下面手动用代码演示下:
a = (i for i in range(10))
print(tuple(a))
print(tuple(a))
#结果为:
#a = (i for i in range(10))
#print(tuple(a))
#print(tuple(a))
或者
a = iter([1,2,3,4,5])
print(tuple(a))
print(tuple(a))
#结果为:
#(1, 2, 3, 4, 5)
#()
另一个发现,看下图代码:
a = (i for i in range(10))
# print(tuple(a))
while True:
print(next(a))
结果为:
Traceback (most recent call last):
0
1
File "C:/Users/Administrator/PycharmProjects/untitled5/连接数据库.py", line 37, in <module>
2
print(next(a))
3
StopIteration
4
5
6
7
8
9
很显然,虽然结果报错,但是在预料之内,只是因为可迭代元素的结果生产完了而已。再来看一下下一个相似又有意思的代码
a = (i for i in range(10))
print(tuple(a))
while True:
print(next(a))
结果为:
Traceback (most recent call last):
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
File "C:/Users/Administrator/PycharmProjects/untitled5/连接数据库.py", line 37, in <module>
print(next(a))
StopIteration
只加了一行代码,但是从报错的结果来看,收获颇丰。首先,转型后,肯定对迭代器中的元素进行了遍历,然后通过某种操作,进行转型。我们基本已经可以确定了,强制转型后,肯定对迭代器中的元素进行了遍历,而且可用元素已经被耗尽了。所以,代码在while循环中,直接就报StopIteration了。