文档章节

python sqlite3使用详解

longfirst
 longfirst
发布于 2014/11/01 20:53
字数 1501
阅读 225
收藏 11

Python SQLITE数据库是一款非常小巧的嵌入式开源数据库软件,也就是说没有独立的维护进程,所有的维护都来自于程序本身。它使用一个文件存储整个数据库,操 作十分方便。它的最大优点是使用方便,功能相比于其它大型数据库来说,确实有些差距。但是性能表现上,SQLITE并不逊色。麻雀虽小,五脏俱全, sqlite 实现了多数 sql-92 的标准,比如说 transaction 、 trigger 和复杂的查询等。

python的数据库模块有统一的接口标准,所以数据库操作都有统一的模式,基本上都是下面几步(假设数据库模块名为db):

1. 用db.connect创建数据库连接,假设连接对象为conn
2. 如果该数据库操作不需要返回结果,就直接用conn.execute查询,根据数据库事务隔离级别的不同,可能修改数据库需要conn.commit
3. 如果需要返回查询结果则用conn.cursor创建游标对象cur, 通过cur.execute查询数据库,用cur.fetchall/cur.fetchone/cur.fetchmany返回查询结果。根据数据库事 务隔离级别的不同,可能修改数据库需要conn.commit
4. 关闭cur, conn

下面让我们一步步走进Python中的SQLite吧。

一,Python SQLITE数据库导入模块:

import sqlite3

二,创建数据库/打开数据库:

cx = sqlite3.connect("E:/test.db") 其实我们不需要显式的创建一个sqlite数据库,在调用connect函数的时候,指定库名称,如果指定的数据库存在就直接打开这个数据库,如果不存在就新创建一个再打开。这一点应用很好理解。

三,数据库连接对象:

打开数据库时返回的对象cx就是一个数据库连接对象,它可以有以下操作:

commit()--事务提交   rollback()--事务回滚   close()--关闭一个数据库连接   cursor()--创建一个游标

四,Python SQLITE数据库游标的使用:

游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL  选择语句相关联。因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。如果曾经用 C 语言写过对文件进行处理的程序,那么游标就像您打开文件所得到的文件句柄一样,只要文件打开成功, 该文件句柄就可代表该文件。对于游标而言,其道理是相同的。可见游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。
        我们知道关系数据库管理系统实质是面向集合的,在Sqlite中并没有一种描述表中单一记录的表达形式,除非使用where  子句来限制只有一条记录被选中。因此我们必须借助于游标来进行面向单条记录的数据处理。 由此可见,游标允许应用程序对查询语句select  返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;它还提供对基于游标位置而对表中数据进行删除或更新的能力;正是游 标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。

下面着重阐述cursor游标的使用。其实,所有sql语句的执行都要在游标对象下进行。

首先,定义一个游标:

cu = cx.cursor() 这样定义了一个游标。游标对象有以下的操作:

execute()--执行sql语句   executemany--执行多条sql语句   close()--关闭游标   fetchone()--从结果中取一条记录,并将游标指向下一条记录   fetchmany()--从结果中取多条记录   fetchall()--从结果中取出所有记录   scroll()--游标滚动 下面就使用Python SQLITE数据库中游标对我们上面建立的数据库作一些操作吧:

1,建表:
cu.execute('create table catalog (id integer primary key,pid integer,name varchar(10) UNIQUE)') 上面语句创建了一个叫catalog的表,它有一个主键id,一个pid,和一个name,name是不可以重复的。

2,插入数据:
cu.execute("insert into catalog values(0, 0, 'name1')")  cu.execute("insert into catalog values(1, 0, 'hello')") 简单的插入两行数据,不过需要提醒的是,只有提交了之后,才能生效.我们使用数据库连接对象cx来进行提交commit和回滚rollback操作.
cx.commit()

3,查询:
cu.execute("select * from catalog") 要提取查询到的数据,使用游标的fetch***函数,如:
print cu.fetchall() 返回结果如下:
[(0, 0, u'name1'), (1, 0, u'hello')] 如果我们使用cu.fetchone(),则首先返回列表中的第一项,再次使用,则返回第二项,依次下去.

4,修改:
cu.execute("update catalog set name='name2' where id = 0") 

cx.commit() 注意,修改数据以后提交

5,删除:
cu.execute("delete from catalog where id = 1")  cx.commit() 以上简单的操作反应的Python SQLITE数据库操作的基本要点,这里点到为止.然后,SQLite的强大,并不仅限于此,其对SQL高级特性的支持及其小巧灵活的特点,使得 SQLite在众多领域受到开发者的青睐.


© 著作权归作者所有

longfirst
粉丝 4
博文 81
码字总数 37827
作品 0
郑州
系统管理员
私信 提问
解决sqlite3.DatabaseError: file is encrypted or ...

笔者在使用python 处理一sqlite3文件时,出现以下错误: sqlite3.DatabaseError: file is encrypted or is not a database 使用的sqlite文件路径是没有问题的,在: http://stackoverflow.c...

樂天
2014/05/19
11.3K
0
二流本科生求大四实习

大三就要结束了,想要在六月之后,找个实习。 个人简介: 使用ubuntu linux两年,能在ubuntu下进行java和python编程,学习了python的django框架,但是还不是很精通,只能简单的建设一个简单的...

22too
2014/04/27
1K
3
python django开发web站点学习遇到的问题

操作系统:macos 编程语言:python 2.7 & django 1.5 & sqlite3 我是python初学者,参考http://www.ibm.com/developerworks/cn/linux/l-django/index.html学习开发web站点,但是遇到一些问题...

火镜先生
2013/03/16
1K
4
sqlite3 jdbc、c接口、python接口处理中文时遇到的问题及其解决方法

sqlite(版本3),以下简称sqlite3,目前功能已经非常强大。目前支持的字符集,包括UTF-8, UTF-16,UTF-16le,UTF-16be。 可是在我们直接使用gbk编码的时候,很可能就会遇到问题。 因为目前,很多...

晨曦之光
2012/04/12
203
0
macOS 下使用 pyenv 编译并使用 Python 3.7 或更新版本

因为不同的项目可能用不同的 Python 版本,于是我用 pyenv 来进行 Python 的多版本管理,而不是用系统自带的 Python 或 homebrew 的 Python。 然而在用 pyenv 编译对应的 Python 版本时,可能...

I'm TualatriX
2018/11/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
8
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
6
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部