8.1.2 Cursor 对象
阅读原文时间:2023年07月11日阅读:1

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

  1 execute(sql[,parameters])

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

import sqlite3

conn = sqlite3.connect('example.db')
cur = conn.cursor()
cur.execute('create table people(name_last,age)')
who = 'Dong'
age = 38

#使用问号做占位符
cur.execute('insert into people values(?,?)',(who,age))
conn.commit()
#使用命令变量做占位符
cur.execute('select * from people where name_last = :who and age = :age',{"who":who,"age":age})
print(cur.fetchone()) #('Dong', 38)
conn.close()

  2 executemany(sql,seq_of_parameters)

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

import sqlite3

#自定义迭代器,按顺序生成小写字母
class IterChars:
def __init__(self):
self.count = ord('a')

 def \_\_iter\_\_(self):  
     return self

 def \_\_next\_\_(self):  
     if self.count > ord('z'):  
         raise StopIteration  
     self.count += 1  
     return (chr(self.count - 1),)

conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('create table characters(c)')

#创建迭代器对象
theIter = IterChars()

#插入记录,每次插入一个英文小写字母
cur.executemany('insert into characters(c) values(?)',theIter)
conn.commit()
#读取并显示所有记录
cur.execute('select * from characters')

#读取并显示所有记录
print(cur.fetchall())
conn.close()

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

import sqlite3
import string

#包含yield语句的函数可以用来创建生成器对象
def char_generator():
for c in string.ascii_lowercase:
yield(c,)

conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.execute("create table characters(c)")

#使用生成器对象得到参数序列
cur.executemany('insert into characters(c) values(?) ',char_generator())
conn.commit()
cur.execute('select c from characters')
print(cur.fetchall())

#[('a',), ('b',), ('c',), ('d',), ('e',), ('f',), ('g',), ('h',), ('i',), ('j',),
# ('k',), ('l',), ('m',), ('n',), ('o',), ('p',), ('q',), ('r',), ('s',), ('t',),
# ('u',), ('v',), ('w',), ('x',), ('y',), ('z',)]

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

import sqlite3
persons = [('Hugo','Boss'),('Calvin','Klein')]
conn=sqlite3.connect(':memory:')

#创建表
conn.execute('create table person(firstname,lastname)')

#插入数据
conn.executemany('insert into person(firstname,lastname) values(?,?)',persons)

#显示数据
for row in conn.execute('select firstname,lastname from person'):
print(row)

print('I just deleted',conn.execute('delete from person').rowcount,'rows')

'''
('Hugo', 'Boss')
('Calvin', 'Klein')
I just deleted 2 rows
'''

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

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

import sqlite3

conn = sqlite3.connect(r'D:/addressBook.db')
#创建表

conn.execute('create table addressList(name,sex,phon,QQ,address)')

# 创建游标
cur = conn.cursor()

#插入数据
cur.execute('''insert into addressList(name,sex,phon,QQ,address) values('王小丫','女','13888997011','66735','北京市')''')
cur.execute('''insert into addressList(name,sex,phon,QQ,address) values('李莉','女','15808066055','675797','天津市')''')
cur.execute('''insert into addressList(name,sex,phon,QQ,address) values('李星草','男','15912108090','3232099','昆明市')''')

#提交事务,把数据写入数据库
conn.commit()
conn.close()

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

import sqlite3

conn = sqlite3.connect(r'D:/addressBook.db')
cur = conn.cursor()
cur.execute('select * from addressList') #查询表中所有数据,将查询结果放在游标中

#获取游标中所有的查询结果
li = cur.fetchall()
for line in li:
for item in line:
print(item,end=' ')
print()

conn.close()

'''
王小丫 女 13888997011 66735 北京市
李莉 女 15808066055 675797 天津市
李星草 男 15912108090 3232099 昆明市
'''