• 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 '''
  • 相关阅读:
    Golang判断文件/文件夹是否存在
    Golang将一个文件中的内容写入到另一个文件里
    Golang打开已存在的文件并覆盖其内容
    Golang打开文件并写入
    【正则】day01
    【正则】day02
    【day09】PHP
    【day08】PHP
    转换函数
    变量作用域
  • 原文地址:https://www.cnblogs.com/avention/p/8964829.html
Copyright © 2020-2023  润新知