Python之SQLite数据库应用简单应用与讲解.docx
《Python之SQLite数据库应用简单应用与讲解.docx》由会员分享,可在线阅读,更多相关《Python之SQLite数据库应用简单应用与讲解.docx(15页珍藏版)》请在冰豆网上搜索。
Python之SQLite数据库应用简单应用与讲解
Python与SQLite数据库应用系统
--Python之SQLite数据库应用
作者:
XX
(XXXX学院,班级:
XX班)
摘要:
Python自带一个轻量级的关系型数据库SQLite。
这一数据库使用SQL语言。
SQLite作为后端数据库,可以制作有数据存储需求的工具。
Python标准库中的sqlite3提供该数据库的接口。
现在作为初学者,我将进行初步的尝试与应用。
关键字:
Python;SQLite;应用;数据库;编程
一·Python与SQLite数据库关系学习初步
作为新时代的大学生学会使用网络查询相关信息非常重要,现在经过初步的网络学习以及书籍查询,现在整理如下:
(一)创建数据库
注:
全文学习范例将以一个简单的关系型数据库为实例,为一个书店存储书的分类和价格。
数据库中包含两个表:
category用于记录分类,book用于记录某个书的信息。
一本书归属于某一个分类,因此book有一个外键(foreignkey),指向catogory表的主键id。
(一)导入PythonSQLITE数据库模块
Python2.5之后,内置了SQLite3,成为了内置模块,这给我们省了安装的功夫,只需导入即可~
在调用connect函数的时候,指定库名称,如果指定的数据库存在就直接打开这个数据库,如果不存在就新创建一个再打开。
也可以创建数据库在内存中。
在使用connect()连接数据库后,我就可以通过定位指针cursor,来执行SQL命令:
importsqlite3
#test.dbisafileintheworkingdirectory.
conn=sqlite3.connect("test.db")
c=conn.cursor()
#createtables
c.execute('''CREATETABLEcategory
(idintprimarykey,sortint,nametext)''')
c.execute('''CREATETABLEbook
(idintprimarykey,
sortint,
nametext,
pricereal,
categoryint,
FOREIGNKEY(category)REFERENCEScategory(id))''')
#savethechanges
mit()
#closetheconnectionwiththedatabase
conn.close()
SQLite的数据库是一个磁盘上的文件,如上面的test.db,因此整个数据库可以方便的移动或复制。
test.db一开始不存在,所以SQLite将自动创建一个新文件。
利用execute()命令,我们执行了两个SQL命令,创建数据库中的两个表。
创建完成后,保存并断开数据库连接。
(二)插入数据
上面创建了数据库和表,确立了数据库的抽象结构。
下面将在同一数据库中插入数据:
importsqlite3
conn=sqlite3.connect("test.db")
c=conn.cursor()
books=[(1,1,'CookRecipe',3.12,1),
(2,3,'PythonIntro',17.5,2),
(3,2,'OSIntro',13.6,2),
]
#execute"INSERT"
c.execute("INSERTINTOcategoryVALUES(1,1,'kitchen')")
#usingtheplaceholder
c.execute("INSERTINTOcategoryVALUES(?
?
?
)",[(2,2,'computer')])
#executemultiplecommands
c.executemany('INSERTINTObookVALUES(?
?
?
?
?
)',books)
mit()
conn.close()
插入数据同样可以使用execute()来执行完整的SQL语句。
SQL语句中的参数,使用"?
"作为替代符号,并在后面的参数中给出具体值。
这里不能用Python的格式化字符串,如"%s",因为这一用法容易受到SQL注入攻击。
我也可以用executemany()的方法来执行多次插入,增加多个记录。
每个记录是表中的一个元素,如上面的books表中的元素。
(三)查询
在执行查询语句后,Python将返回一个循环器,包含有查询获得的多个记录。
你循环读取,也可以使用sqlite3提供的fetchone()和fetchall()方法读取记录:
importsqlite3
conn=sqlite3.connect('test.db')
c=conn.cursor()
#retrieveonerecord
c.execute('SELECTnameFROMcategoryORDERBYsort')
print(c.fetchone())
print(c.fetchone())
#retrieveallrecordsasalist
c.execute('SELECT*FROMbookWHEREbook.category=1')
print(c.fetchall())
#iteratethroughtherecords
forrowinc.execute('SELECTname,priceFROMbookORDERBYsort'):
print(row)
(四)更新与删除
你可以更新某个记录,或者删除记录:
#ByVamei
conn=sqlite3.connect("test.db")
c=conn.cursor()
c.execute('UPDATEbookSETprice=?
WHEREid=?
',(1000,1))
c.execute('DELETEFROMbookWHEREid=2')
mit()
conn.close()
我们也可以直接删除整张表:
c.execute('DROPTABLEbook')
如果删除test.db,那么整个数据库会被删除。
二·初步尝试与应用
(一)说明;本次笔者创建数据库将以实验四中题目为基础:
设计一个数据库,包含学生信息表、课程信息表和成绩信息表,请写出各个表的数据结构的SQL语句;
以及将进行简单的数据录入,删除,修改和录入等操作
(二)尝试代码:
importsqlite3
file=sqlite3.connect("Mydatabase.db3")
flag=file.cursor()
flag.execute("CREATETABLEIFNOTEXISTSstudent(idINTEGERPRIMARYKEYAUTOINCREMENT,nameTEXT,sexINTEGER,classnameTEXT);")
flag.execute("CREATETABLEIFNOTEXISTScourse(idINTEGERPRIMARYKEYAUTOINCREMENT,titleTEXT);")
flag.execute("CREATETABLEIFNOTEXISTSxk(std_idINTEGER,crs_idINTEGER,scoreREAL,PRIMARYKEY(std_id,crs_id));")
mit()
#2.向学生信息表和课程信息表各增加五条记录数据,请写出增加数据的SQL语句,以“INSERTINTO”开头。
importsqlite3
file=sqlite3.connect("Mydatabase.db3")
flag=file.cursor()
foriin[(1,'Zhang',0,'gg51'),(2,'Wang',0,'gg51'),(3,'Zhao',1,'gg52'),(4,'Li',0,'gg52'),(5,'Fang',1,'gg51')]:
flag.execute("insertintostudentvalues(?
?
?
?
)",i)
foriin[(1,'Python'),(2,'C++'),(3,'Java'),(4,'Computer'),(5,'Android')]:
flag.execute("insertintocoursevalues(?
?
)",i)
mit()
#3.删除学生信息表和课程信息表的个别记录数据,请写出删除数据的SQL语句,以“DELETEFROM”开头。
importsqlite3
file=sqlite3.connect("Mydatabase.db3")
flag=file.cursor()
flag.execute("SELECT*FROMstudentWHEREid=3;")
print(flag.fetchone())
mit()
file.close()
#4.修改学生信息表和课程信息表的个别记录数据,请写出修改数据的SQL语句,以“UPDATE”开头。
importsqlite3
file=sqlite3.connect("Mydatabase.db3")
flag=file.cursor()
flag.execute("UPDATEstudentSETname='Liu'WHEREid=4;")
flag.execute("UPDATEcourseSETtitle='C++'WHEREid=2;")
print(flag.fetchone())
mit()
#5.向成绩信息表增加十条记录数据,请写出增加数据的SQL语句,以“INSERTINTO”开头。
importsqlite3
file=sqlite3.connect("Mydatabase.db3")
flag=file.cursor()
foriin[(1,1,90),(1,2,80),(1,3,100),(2,1,60),(2,2,100)]:
flag.execute("insertintoxkvalues(?
?
?
)",i)
foriin[(2,3,90),(3,1,80),(3,2,100),(3,3,60),(4,1,76)]:
flag.execute("insertintoxkvalues(?
?
?
)",i)
mit()
file.close()
(三)运行结果:
参考文献:
(1)大学计算机基础(第四版)姚普选主编。
--北京:
清华大学出版社,2012.9
(2)博客园,博主;:
Vamei
三·总结
sqlite3只是一个SQLite的接口。
想要熟练的使用SQLite数据库,还需要学习更多的关系型数据库的知识,Phthon确实有比较强大的数据库,可以想象C++的数据库该有多么强大,期待的下学期对于C++的学习。
并在这里祝福每一位奋战的同学期末取得好成绩,过一个快乐而又充实的寒假。
附录一:
个人感想
附录二:
Python.Sqlite中常见函数及举例
附录三:
生成数据库与对应的五个程序代码(详见额外的文件夹)
附录一
通过本次实验探究,亦或是第一次尝试论文的书写,个人觉得还是有许多收获:
一方面,需要自身在比较繁忙的学业中抽出时间,合理规划安排时间,寻找并查询相应Python,SQlite知识,以及它们的融合,并自学之;
另一方面,尽管在本次的论文中很许多的不成熟或是可以修改的地方,但是总体上,为了完成此次论文,还是需要许多格式的查询,也算是提前进行了一次论文的练习吧。
附录二
(一)使用游标查询数据库
cu=cx.cursor()
游标对象有以下的操作:
1.execute()--执行sql语句
2.executemany--执行多条sql语句
3.close()--关闭游标
4.fetchone()--从结果中取一条记录,并将游标指向下一条记录
5.fetchmany()--从结果中取多条记录
6.fetchall()--从结果中取出所有记录
7.scroll()--游标滚动
(二)建表
cu.execute("createtablecatalog(idintegerprimarykey,pidinteger,namevarchar(10)UNIQUE,nicknametextNULL)")
上面语句创建了一个叫catalog的表,它有一个主键id,一个pid,和一个name,name是不可以重复的,以及一个nickname默认为NULL。
插入数据
#Neverdothis--insecure会导致注入攻击
pid=200
c.execute("...wherepid='%s'"%pid)正确的做法如下,如果t只是单个数值,也要采用t=(n,)的形式,因为元组是不可变的。
fortin[(0,10,'abc','Yu'),(1,20,'cba','Xu')]:
cx.execute("insertintocatalogvalues(?
?
?
?
)",t)简单的插入两行数据,不过需要提醒的是,只有提交了之后,才能生效.我们使用数据库连接对象cx来进行提交commit和回滚rollback操作.
mit()
(三)查询
cu.execute("select*fromcatalog")
要提取查询到的数据,使用游标的fetch函数,如:
In[10]:
cu.fetchall()
Out[10]:
[(0,10,u'abc',u'Yu'),(1,20,u'cba',u'Xu')]如果我们使用cu.fetchone(),则首先返回列表中的第一项,再次使用,则返回第二项,依次下去.
(四)修改
In[12]:
cu.execute("updatecatalogsetname='Boy'whereid=0")
In[13]:
mit()注意,修改数据以后提交
(五)删除
cu.execute("deletefromcatalogwhereid=1")
mit()
(六)使用中文
请先确定你的IDE或者系统默认编码是utf-8,并且在中文前加上u
x=u'鱼'
cu.execute("updatecatalogsetname=?
whereid=0",x)
cu.execute("select*fromcatalog")
cu.fetchall()
[(0,10,u'\u9c7c',u'Yu'),(1,20,u'cba',u'Xu')]如果要显示出中文字体,那需要依次打印出每个字符串
In[26]:
foritemincu.fetchall():
....:
forelementinitem:
....:
printelement,
....:
print
....:
010鱼Yu
120cbaXu
(七)Row类型
Row提供了基于索引和基于名字大小写敏感的方式来访问列而几乎没有内存开销。
原文如下:
sqlite3.Rowprovidesbothindex-basedandcase-insensitivename-basedaccesstocolumnswithalmostnomemoryoverhead.Itwillprobablybebetterthanyourowncustomdictionary-basedapproachorevenadb_rowbasedsolution.
Row对象的详细介绍
classsqlite3.Row
ARowinstanceservesasahighlyoptimizedrow_factoryforConnectionobjects.Ittriestomimicatupleinmostofitsfeatures.
Itsupportsmappingaccessbycolumnnameandindex,iteration,representation,equalitytestingandlen().
IftwoRowobjectshaveexactlythesamecolumnsandtheirmembersareequal,theycompareequal.
Changedinversion2.6:
Addediterationandequality(hashability).
keys()
Thismethodreturnsatupleofcolumnnames.Immediatelyafteraquery,itisthefirstmemberofeachtupleinCursor.description.
Newinversion2.6.
下面举例说明
In[30]:
cx.row_factory=sqlite3.Row
In[31]:
c=cx.cursor()
In[32]:
c.execute('select*fromcatalog')
Out[32]:
In[33]:
r=c.fetchone()
In[34]:
type(r)
Out[34]:
In[35]:
r
Out[35]:
In[36]:
printr
(0,10,u'\u9c7c',u'Yu')
In[37]:
len(r)
Out[37]:
4
In[39]:
r[2]#使用索引查询
Out[39]:
u'\u9c7c'
In[41]:
r.keys()
Out[41]:
['id','pid','name','nickname']
In[42]:
foreinr:
....:
printe,
....:
010鱼Yu
使用列的关键词查询
In[43]:
r['id']
Out[43]:
0
In[44]:
r['name']
Out[44]:
u'\u9c7c'