游标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 '''