8.1.2 Cursor 对象

  游标Cursor也是sqlite3模块中比较重要的一个类,下面简单介绍下Cursor对象的常用方法。

 

  1 execute(sql[,parameters])

  该方法用于执行一条SQL语句,下面的代码演示了用法,以及为SQL语句传递参数的两种方法,分别使用问号好命名变量作为占位符。

 1 import sqlite3
 2 
 3 conn = sqlite3.connect('example.db')
 4 cur = conn.cursor()
 5 cur.execute('create table people(name_last,age)')
 6 who = 'Dong'
 7 age = 38
 8 
 9 #使用问号做占位符
10 cur.execute('insert into people values(?,?)',(who,age))
11 conn.commit()
12 #使用命令变量做占位符
13 cur.execute('select * from people where name_last = :who and age = :age',{"who":who,"age":age})
14 print(cur.fetchone())     #('Dong', 38)
15 conn.close()

 

  2 executemany(sql,seq_of_parameters)

  该方法用来对于所有给定参数执行用一个SQL语句,参数序列可以使用不同的方式产生,例如下面的代码使用迭代来产生参数序列:

 1 import sqlite3
 2 
 3 #自定义迭代器,按顺序生成小写字母
 4 class IterChars:
 5     def __init__(self):
 6         self.count = ord('a')
 7 
 8     def __iter__(self):
 9         return self
10 
11     def __next__(self):
12         if self.count > ord('z'):
13             raise StopIteration
14         self.count += 1
15         return (chr(self.count - 1),)
16 
17 
18 conn = sqlite3.connect(':memory:')
19 cur = conn.cursor()
20 cur.execute('create table characters(c)')
21 
22 #创建迭代器对象
23 theIter = IterChars()
24 
25 #插入记录,每次插入一个英文小写字母
26 cur.executemany('insert into characters(c) values(?)',theIter)
27 conn.commit()
28 #读取并显示所有记录
29 cur.execute('select * from characters')
30 
31 #读取并显示所有记录
32 print(cur.fetchall())
33 conn.close()

  

  下面的代码则使用了更为简洁的生成器来产生参数:

 1 import sqlite3
 2 import string
 3 
 4 #包含yield语句的函数可以用来创建生成器对象
 5 def char_generator():
 6     for c in string.ascii_lowercase:
 7         yield(c,)
 8 
 9 conn = sqlite3.connect(":memory:")
10 cur = conn.cursor()
11 cur.execute("create table characters(c)")
12 
13 #使用生成器对象得到参数序列
14 cur.executemany('insert into characters(c) values(?) ',char_generator())
15 conn.commit()
16 cur.execute('select c from characters')
17 print(cur.fetchall())
18 
19 #[('a',), ('b',), ('c',), ('d',), ('e',), ('f',), ('g',), ('h',), ('i',), ('j',), 
20 # ('k',), ('l',), ('m',), ('n',), ('o',), ('p',), ('q',), ('r',), ('s',), ('t',), 
21 # ('u',), ('v',), ('w',), ('x',), ('y',), ('z',)]

 

  下面的代码则使用直接创建的序列作为SQL语句的参数:

 1 import sqlite3
 2 persons = [('Hugo','Boss'),('Calvin','Klein')]
 3 conn=sqlite3.connect(':memory:')
 4 
 5 #创建表
 6 conn.execute('create table person(firstname,lastname)')
 7 
 8 #插入数据
 9 conn.executemany('insert into person(firstname,lastname) values(?,?)',persons)
10 
11 #显示数据
12 for row in conn.execute('select firstname,lastname from person'):
13     print(row)
14 
15 print('I just deleted',conn.execute('delete from person').rowcount,'rows')
16 
17 '''
18 ('Hugo', 'Boss')
19 ('Calvin', 'Klein')
20 I just deleted 2 rows
21 '''

 

  3 fetchone()、fetchmany(size=cursor.arraysize)、fetchall()

  这3个方法用来读取数据。假设数据库通过下面的代码创建并插入数据:

 1 import sqlite3
 2 
 3 conn = sqlite3.connect(r'D:/addressBook.db')
 4 #创建表
conn.execute('create table addressList(name,sex,phon,QQ,address)')
 5 # 创建游标
 6 cur = conn.cursor()                 
 7 
 8 #插入数据
 9 cur.execute('''insert into addressList(name,sex,phon,QQ,address) values('王小丫','女','13888997011','66735','北京市')''')
10 cur.execute('''insert into addressList(name,sex,phon,QQ,address) values('李莉','女','15808066055','675797','天津市')''')
11 cur.execute('''insert into addressList(name,sex,phon,QQ,address) values('李星草','男','15912108090','3232099','昆明市')''')
12 
13 #提交事务,把数据写入数据库
14 conn.commit()
15 conn.close()

 

  #下面的代码演示了使用fetchall()读取数据的方法:

 1 import sqlite3
 2 
 3 conn = sqlite3.connect(r'D:/addressBook.db')
 4 cur = conn.cursor()
 5 cur.execute('select * from addressList')    #查询表中所有数据,将查询结果放在游标中
 6 
 7 #获取游标中所有的查询结果
 8 li = cur.fetchall()
 9 for line in li:
10     for item in line:
11         print(item,end=' ')
12     print()
13 
14 conn.close()
15 
16 '''
17 王小丫 女 13888997011 66735 北京市
18 李莉 女 15808066055 675797 天津市
19 李星草 男 15912108090 3232099 昆明市
20 '''
posted @ 2018-04-27 22:10  Avention  阅读(557)  评论(0编辑  收藏  举报