1、Python 与 SQLite 数据库应用系统-Python 之 SQLite 数据库应用作者:XX(XXXX 学院,班级:XX 班)摘要:Python 自带一个轻量级的关系型数据库 SQLite。这一数据库使用 SQL 语言。SQLite 作为后端数据库,可以制作有数据存储需求的工具。Python 标准库中的 sqlite3 提供该数据库的接口。现在作为初学者,我将进行初步的尝试与应用。关键字:Python;SQLite;应用;数据库;编程一Python 与 SQLite 数据库关系学习初步作为新时代的大学生学会使用网络查询相关信息非常重要,现在经过初步的网络学习以及书籍查询,现在整理如下:
2、(一) 创建数据库注:全文学习范例将以一个简单的关系型数据库为实例,为一个书店存储书的分类和价格。数据库中包含两个表:category 用于记录分类,book 用于记录某个书的信息。一本书归属于某一个分类,因此 book有一个外键(foreign key),指向 catogory 表的主键 id。(一)导入 Python SQLITE 数据库模块 Python2.5 之后,内置了 SQLite3,成为了内置模块,这给我们省了安装的功夫,只需导入即可在调用 connect 函数的时候,指定库名称,如果指定的数据库存在就直接打开这个数据库,如果不存在就新创建一个再打开。也可以创建数据库在内存中。在
3、使用 connect()连接数据库后,我就可以通过定位指针 cursor,来执行 SQL 命令:import sqlite3# test.db is a file in the working directory.conn = sqlite3.connect(“test.db“)c = conn.cursor()# create tablesc.execute(CREATE TABLE category(id int primary key, sort int, name text)c.execute(CREATE TABLE book(id int primary key, sort int
4、, name text, price real, category int,FOREIGN KEY (category) REFERENCES category(id)# save the mit()# close the connection with the databaseconn.close() SQLite 的数据库是一个磁盘上的文件,如上面的 test.db,因此整个数据库可以方便的移动或复制。test.db 一开始不存在,所以 SQLite 将自动创建一个新文件。利用 execute()命令,我们执行了两个 SQL 命令,创建数据库中的两个表。创建完成后,保存并断开数据库连接。(
5、二)插入数据上面创建了数据库和表,确立了数据库的抽象结构。下面将在同一数据库中插入数据:import sqlite3conn = sqlite3.connect(“test.db“)c = conn.cursor()books = (1, 1, Cook Recipe, 3.12, 1),(2, 3, Python Intro, 17.5, 2),(3, 2, OS Intro, 13.6, 2),# execute “INSERT“ c.execute(“INSERT INTO category VALUES (1, 1, kitchen)“)# using the placeholderc
6、.execute(“INSERT INTO category VALUES (?, ?, ?)“, (2, 2, computer)# execute multiple commandsc.executemany(INSERT INTO book VALUES (?, ?, ?, ?, ?), books)mit()conn.close() 插入数据同样可以使用 execute()来执行完整的 SQL 语句。SQL 语句中的参数,使用“?“作为替代符号,并在后面的参数中给出具体值。这里不能用 Python 的格式化字符串,如“%s“,因为这一用法容易受到SQL 注入攻击。我也可以用 execu
7、temany()的方法来执行多次插入,增加多个记录。每个记录是表中的一个元素,如上面的 books 表中的元素。(三)查询在执行查询语句后,Python 将返回一个循环器,包含有查询获得的多个记录。你循环读取,也可以使用sqlite3 提供的 fetchone()和 fetchall()方法读取记录:import sqlite3conn = sqlite3.connect(test.db)c = conn.cursor()# retrieve one recordc.execute(SELECT name FROM category ORDER BY sort)print(c.fetchone
8、()print(c.fetchone()# retrieve all records as a listc.execute(SELECT * FROM book WHERE book.category=1)print(c.fetchall()# iterate through the recordsfor row in c.execute(SELECT name, price FROM book ORDER BY sort):print(row)(四)更新与删除你可以更新某个记录,或者删除记录:# By Vameiconn = sqlite3.connect(“test.db“)c = con
9、n.cursor()c.execute(UPDATE book SET price=? WHERE id=?,(1000, 1)c.execute(DELETE FROM book WHERE id=2)mit()conn.close()我们也可以直接删除整张表:c.execute(DROP TABLE book)如果删除 test.db,那么整个数据库会被删除。二初步尝试与应用(一) 说明;本次笔者创建数据库将以实验四中题目为基础:设计一个数据库,包含学生信息表、课程信息表和成绩信息表,请写出各个表的数据结构的 SQL语句;以及将进行简单的数据录入,删除,修改和录入等操作(二)尝试代码:im
10、port sqlite3file=sqlite3.connect(“Mydatabase.db3“)flag=file.cursor()flag.execute(“CREATE TABLE IF NOT EXISTS student(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,sex INTEGER,classname TEXT );“)flag.execute(“CREATE TABLE IF NOT EXISTS course(id INTEGER PRIMARY KEY AUTOINCREMENT,title TEXT);“)flag.e
11、xecute(“CREATE TABLE IF NOT EXISTS xk(std_id INTEGER,crs_id INTEGER,score REAL,PRIMARY KEY(std_id,crs_id);“)mit()#2. 向学生信息表和课程信息表各增加五条记录数据,请写出增加数据的 SQL 语句,以“INSERT INTO”开头。import sqlite3file=sqlite3.connect(“Mydatabase.db3“)flag=file.cursor()for i in(1,Zhang,0,gg51),(2,Wang,0,gg51),(3,Zhao,1,gg52),(
12、4,Li,0,gg52),(5,Fang,1,gg51):flag.execute(“insert into student values(?,?,?,?)“,i) for i in(1,Python),(2,C+),(3,Java),(4,Computer),(5,Android):flag.execute(“insert into course values(?,?)“,i)mit()#3. 删除学生信息表和课程信息表的个别记录数据,请写出删除数据的 SQL 语句,以“DELETE FROM”开头。import sqlite3file=sqlite3.connect(“Mydatabase
13、.db3“)flag=file.cursor()flag.execute(“SELECT * FROM student WHERE id=3;“)print(flag.fetchone()mit()file.close()#4. 修改学生信息表和课程信息表的个别记录数据,请写出修改数据的 SQL 语句,以“UPDATE”开头。import sqlite3file=sqlite3.connect(“Mydatabase.db3“)flag=file.cursor()flag.execute(“UPDATE student SET name=Liu WHERE id=4;“)flag.execut
14、e(“UPDATE course SET title=C+ WHERE id=2;“)print(flag.fetchone()mit()#5.向成绩信息表增加十条记录数据,请写出增加数据的 SQL 语句,以“INSERT INTO”开头。import sqlite3file=sqlite3.connect(“Mydatabase.db3“)flag=file.cursor()for i in(1,1,90),(1,2,80),(1,3,100),(2,1,60),(2,2,100):flag.execute(“insert into xk values(?,?,?)“,i) for i in
15、(2,3,90),(3,1,80),(3,2,100),(3,3,60),(4,1,76):flag.execute(“insert into xk values(?,?,?)“,i)mit()file.close()(三)运行结果:参考文献:(1) 大学计算机基础(第四版)姚普选主编。-北京:清华大学出版社,2012.9(2) 博客园,博主;:Vamei三总结sqlite3 只是一个 SQLite 的接口。想要熟练的使用 SQLite 数据库,还需要学习更多的关系型数据库的知识,Phthon 确实有比较强大的数据库,可以想象 C+的数据库该有多么强大,期待的下学期对于 C+的学习。并在这里祝
16、福每一位奋战的同学期末取得好成绩,过一个快乐而又充实的寒假。附录一:个人感想附录二:Python.Sqlite 中常见函数及举例附录三:生成数据库与对应的五个程序代码(详见额外的文件夹)附录一通过本次实验探究,亦或是第一次尝试论文的书写,个人觉得还是有许多收获:一方面,需要自身在比较繁忙的学业中抽出时间,合理规划安排时间,寻找并查询相应Python,SQlite 知识,以及它们的融合,并自学之; 另一方面,尽管在本次的论文中很许多的不成熟或是可以修改的地方,但是总体上,为了完成此次论文,还是需要许多格式的查询,也算是提前进行了一次论文的练习吧。附录二(一)使用游标查询数据库 cu=cx.cur
17、sor() 游标对象有以下的操作: 1.execute()-执行 sql 语句 2.executemany-执行多条 sql 语句 3.close()-关闭游标 4.fetchone()-从结果中取一条记录,并将游标指向下一条记录 5.fetchmany()-从结果中取多条记录 6.fetchall()-从结果中取出所有记录 7.scroll()-游标滚动 (二)建表cu.execute(“create table catalog (id integer primary key,pid integer,name varchar(10) UNIQUE,nickname text NULL)“)上
18、面语句创建了一个叫 catalog 的表,它有一个主键 id,一个 pid,和一个 name,name 是不可以重复的,以及一个 nickname 默认为 NULL。插入数据 # Never do this - insecure 会导致注入攻击pid=200c.execute(“. where pid = %s“ % pid)正确的做法如下,如果 t 只是单个数值,也要采用 t=(n,)的形式,因为元组是不可变的。 for t in(0,10,abc,Yu),(1,20,cba,Xu):cx.execute(“insert into catalog values (?,?,?,?)“, t)简
19、单的插入两行数据,不过需要提醒的是,只有提交了之后,才能生效.我们使用数据库连接对象 cx 来进行提交 commit 和回滚rollback 操作mit()(三)查询cu.execute(“select * from catalog“) 要提取查询到的数据,使用游标的 fetch 函数,如:In 10: cu.fetchall()Out10: (0, 10, uabc, uYu), (1, 20, ucba, uXu)如果我们使用cu.fetchone(),则首先返回列表中的第一项,再次使用,则返回第二项,依次下去.(四)修改In 12: cu.execute(“update catalog
20、set name=Boy where id = 0“)In 13: mit()注意, 修改数据以后提交(五)删除cu.execute(“delete from catalog where id = 1“) mit() (六)使用中文请先确定你的 IDE 或者系统默认编码是 utf-8,并且在中文前加上 u x=u鱼cu.execute(“update catalog set name=? where id = 0“,x)cu.execute(“select * from catalog“)cu.fetchall()(0, 10, uu9c7c, uYu), (1, 20, ucba, uXu)
21、如果要显示出中文字体,那需要依次打印出每个字符串In 26: for item in cu.fetchall(): for element in item: print element,: print: 0 10 鱼 Yu1 20 cba Xu(七)Row 类型Row 提供了基于索引和基于名字大小写敏感的方式来访问列而几乎没有内存开销。 原文如下:sqlite3.Row provides both index-based and case-insensitive name-based access to columns with almost no memory overhead. It wi
22、ll probably be better than your own custom dictionary-based approach or even a db_row based solution. Row 对象的详细介绍class sqlite3.RowA Row instance serves as a highly optimized row_factory for Connection objects. It tries to mimic a tuple in most of its features.It supports mapping access by column nam
23、e and index, iteration, representation, equality testing and len().If two Row objects have exactly the same columns and their members are equal, they compare equal.Changed in version 2.6: Added iteration and equality (hashability).keys()This method returns a tuple of column names. Immediately after
24、a query, it is the first member of each tuple in Cursor.description.New in version 2.6.下面举例说明In 30: cx.row_factory = sqlite3.RowIn 31: c = cx.cursor()In 32: c.execute(select * from catalog)Out32: In 33: r = c.fetchone()In 34: type(r)Out34: In 35: rOut35: In 36: print r(0, 10, uu9c7c, uYu)In 37: len(r)Out37: 4In 39: r2 #使用索引查询Out39: uu9c7cIn 41: r.keys()Out41: id, pid, name, nicknameIn 42: for e in r: print e,: 0 10 鱼 Yu使用列的关键词查询In 43: ridOut43: 0In 44: rnameOut44: uu9c7c