Python操作SQLite数据库的方法详解
本文实例讲述了Python操作SQLite数据库的方法。分享给大家供大家参考,具体如下:
SQLite简单介绍
SQLite数据库是一款非常小巧的嵌入式开源数据库软件,也就是说没有独立的维护进程,所有的维护都来自于程序本身。它是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月.至今已经有10个年头,SQLite也迎来了一个版本SQLite3已经发布。
安装与使用
1.导入PythonSQLITE数据库模块
Python2.5之后,内置了SQLite3,成为了内置模块,这给我们省了安装的功夫,只需导入即可~
importsqlite3
2.创建/打开数据库
在调用connect函数的时候,指定库名称,如果指定的数据库存在就直接打开这个数据库,如果不存在就新创建一个再打开。
cx=sqlite3.connect("E:/test.db")
也可以创建数据库在内存中。
con=sqlite3.connect(":memory:")
3.数据库连接对象
打开数据库时返回的对象cx就是一个数据库连接对象,它可以有以下操作:
①commit()--事务提交
②rollback()--事务回滚
③close()--关闭一个数据库连接
④cursor()--创建一个游标
关于commit(),如果isolation_level隔离级别默认,那么每次对数据库的操作,都需要使用该命令,你也可以设置isolation_level=None,这样就变为自动提交模式。
4.使用游标查询数据库
我们需要使用游标对象SQL语句查询数据库,获得查询对象。通过以下方法来定义一个游标。
cu=cx.cursor()
游标对象有以下的操作:
①execute()--执行sql语句
②executemany--执行多条sql语句
③close()--关闭游标
④fetchone()--从结果中取一条记录,并将游标指向下一条记录
⑤fetchmany()--从结果中取多条记录
⑥fetchall()--从结果中取出所有记录
⑦scroll()--游标滚动
1.建表
cu.execute("createtablecatalog(idintegerprimarykey,pidinteger,namevarchar(10)UNIQUE,nicknametextNULL)")
上面语句创建了一个叫catalog的表,它有一个主键id,一个pid,和一个name,name是不可以重复的,以及一个nickname默认为NULL。
2.插入数据
请注意避免以下写法:
#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操作.
cx.commit()
3.查询
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(),则首先返回列表中的第一项,再次使用,则返回第二项,依次下去.
4.修改
In[12]:cu.execute("updatecatalogsetname='Boy'whereid=0") In[13]:cx.commit()
注意,修改数据以后提交
5.删除
cu.execute("deletefromcatalogwhereid=1") cx.commit()
6.使用中文
请先确定你的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
7.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'
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python常见数据库操作技巧汇总》、《Python编码操作技巧总结》、《Python图片操作技巧总结》、《Python数据结构与算法教程》、《PythonSocket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。