python第三方库sqlite3的基本使用

什么是 SQLite

       SQLite是一款轻量级的、基于文件的嵌入式数据库,实现自包容、零配置、支持事务的SQL数据库引擎。与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下,只要确保SQLite的二进制文件存在即可开始创建、连接和使用数据库。第一个Alpha版本诞生于2000年5月,直到今天已经成为最流行的嵌入式数据库,包括Google在内的许多公司在其桌面软件中亦使用SQLite存储用户数据,由此看来,其稳定性毋庸置疑。

       实际应用中,SQLite作为目前最为流行的开源嵌入式关系型数据库,在系统的架构设计中正扮演着越来越重要的角色。和很多其它嵌入式NoSQL数据库(如BerkeleyDB、MemBASE等)不同的是,SQLite支持很多关系型数据库的基本特征,如标准SQL语法、事务、数据表和索引等,这在数据移植、程序演示等应用中有着不可替代的优势。从官方文档中我们可以获悉到,SQLite支持的数据量和运行效率都是非常骄人的,因此在海量数据的解决方案中,SQLite可以作为数据预计算的桥头堡,从而显著减少存储在关系型数据库服务器中的数据数量,最终提高系统的查询效率和运行期效率,同时也可以显著的降低数据备份的磁盘开销。

SQLite的主要特征:
    1). 管理简单,甚至可以认为无需管理。
    2). 操作方便,SQLite生成的数据库文件可以在各个平台无缝移植。
    3). 可以非常方便的以多种形式嵌入到其他应用程序中,如静态库、动态库等。
    4). 易于维护。

  综上所述,SQLite的主要优势在于灵巧、快速和可靠性高。SQLite的设计者们为了达到这一目标,在功能上作出了很多关键性的取舍,与此同时,也失去了一些对RDBMS关键性功能的支持,如高并发、细粒度访问控制(如行级锁)、丰富的内置函数、存储过程和复杂的SQL语句等。正是因为这些功能的牺牲才换来了简单,而简单又换来了高效性和高可靠性。

SQLite的优势

  ①   免配置。和Access一样,只要把数据库文件通过FTP上传到服务器上即可使用,不需要服务器的额外支持。

  ②   备份方便。因为只是一个文件,只要复制一份该文件,就能备份整个数据库。

  ③   虽然是轻量级数据库。但最大能支持2TB 大小的单个库文件。

  ④   速度快。在几百万条记录的情况下,其插入和查询速度与MySQL不分上下,快于SQL Server,10倍于Access(但这并不意味着它可以替代SQL Server)。

SQLite的主要优点

  1. 一致性的文件格式:
  在SQLite的官方文档中是这样解释的,我们不要将SQLite与Oracle或PostgreSQL去比较,而是应该将它看做fopen和fwrite。与我们自定义格式的数据文件相比,SQLite不仅提供了很好的移植性,如大端小端、32/64位等平台相关问题,而且还提供了数据访问的高效性,如基于某些信息建立索引,从而提高访问或排序该类数据的性能,SQLite提供的事务功能,也是在操作普通文件时无法有效保证的。
  2. 在嵌入式或移动设备上的应用:
  由于SQLite在运行时占用的资源较少,而且无需任何管理开销,因此对于PDA、智能手机等移动设备来说,SQLite的优势毋庸置疑。
  3. 内部数据库:
  在有些应用场景中,我们需要为插入到数据库服务器中的数据进行数据过滤或数据清理,以保证最终插入到数据库服务器中的数据有效性。有的时候,数据是否有效,不能通过单一一条记录来进行判断,而是需要和之前一小段时间的历史数据进行特殊的计算,再通过计算的结果判断当前的数据是否合法。在这种应用中,我们可以用SQLite缓冲这部分历史数据。还有一种简单的场景也适用于SQLite,即统计数据的预计算。比如我们正在运行数据实时采集的服务程序,我们可能需要将每10秒的数据汇总后,形成每小时的统计数据,该统计数据可以极大的减少用户查询时的数据量,从而大幅提高前端程序的查询效率。在这种应用中,我们可以将1小时内的采集数据均缓存在SQLite中,在达到整点时,计算缓存数据后清空该数据。
  4. 数据分析:
  可以充分利用SQLite提供SQL特征,完成简单的数据统计分析的功能。这一点是CSV文件无法比拟的。
  5. 产品Demo和测试:
  在需要给客户进行Demo时,可以使用SQLite作为我们的后台数据库,和其他关系型数据库相比,使用SQLite减少了大量的系统部署时间。对于产品的功能性测试而言,SQLite也可以起到相同的作用。

SQLite个性化特征

  1. 零配置:
  SQLite本身并不需要任何初始化配置文件,也没有安装和卸载的过程。当然也不存在服务器实例的启动和停止。在使用的过程中,也无需创建用户和划分权限。在系统出现灾难时,如电源问题、主机问题等,对于SQLite而言,不需要做任何操作。
  2. 没有独立的服务器:
  和其他关系型数据库不同的是,SQLite没有单独的服务器进程,以供客户端程序访问并提供相关的服务。SQLite作为一种嵌入式数据库,其运行环境与主程序位于同一进程空间,因此它们之间的通信完全是进程内通信,而相比于进程间通信,其效率更高。然而需要特别指出的是,该种结构在实际运行时确实存在保护性较差的问题,比如此时,应用程序出现问题导致进程崩溃,由于SQLite与其所依赖的进程位于同一进程空间,那么此时SQLite也将随之退出。但是对于独立的服务器进程,则不会有此问题,它们将在密闭性更好的环境下完成它们的工作。
  3. 单一磁盘文件:
  SQLite的数据库被存放在文件系统的单一磁盘文件内,只要有权限便可随意访问和拷贝,这样带来的主要好处是便于携带和共享。其他的数据库引擎,基本都会将数据库存放在一个磁盘目录下,然后由该目录下的一组文件构成该数据库的数据文件。尽管我们可以直接访问这些文件,但是我们的程序却无法操作它们,只有数据库实例进程才可以做到。这样的好处是带来了更高的安全性和更好的性能,但是也付出了安装和维护复杂的代价。
  4. 平台无关性:
  这一点在前面已经解释过了。和SQLite相比,很多数据库引擎在备份数据时不能通过该方式直接备份,只能通过数据库系统提供的各种dump和restore工具,将数据库中的数据先导出到本地文件中,之后在load到目标数据库中。这种方式存在显而易见的效率问题,首先需要导出到另外一个文件,如果数据量较大,导出的过程将会比较耗时。然而这只是该操作的一小部分,因为数据导入往往需要更多的时间。数据在导入时需要很多的验证过程,在存储时,也并非简简单单的顺序存储,而是需要按照一定的数据结构、算法和策略存放在不同的文件位置。因此和直接拷贝数据库文件相比,其性能是非常拙劣的。
  5. 弱类型:
  和大多数支持静态类型的数据库不同的是,SQLite中的数据类型被视为数值的一个属性。因此对于一个数据表列而言,即便在声明该表时给出了该列的类型,我们在插入数据时仍然可以插入任意类型,比如Integer的列被存入字符串'hello'。针对该特征唯一的例外是整型的主键列,对于此种情况,我们只能在该列中存储整型数据。
  6. SQL语句编译成虚拟机代码:
    很多数据库产品会将SQL语句解析成复杂的,相互嵌套的数据结构,之后再交予执行器遍历该数据结构完成指定的操作。相比于此,SQLite会将SQL语句先编译成字节码,之后再交由其自带的虚拟机去执行。该方式提供了更好的性能和更出色的调试能力。

SQLite安装

SQLite on Windows

1)进入 SQL 下载页面:SQLite Download Page

2)下载 Windows 下的预编译二进制文件包:

sqlite-shell-win32-x86-<build#>.zip
sqlite-dll-win32-x86-<build#>.zip

(注意: <build#> 是 sqlite 的编译版本号)

  • 下载 sqlite-shell-win32-*.zip 和 sqlite-dll-win32-*.zip 压缩文件。
  • 创建文件夹sqlite,并在此文件夹下解压上面两个压缩文件,将得到 sqlite3.def、sqlite3.dll 和 sqlite3.exe 文件。
  • 添加sqlite 到 PATH 环境变量,以方便在命令行中执行 sqlite 命令。

 可选: 如果你计划发布基于 sqlite 数据库的应用程序,你还需要下载源码以便编译和利用其 API。

sqlite-amalgamation-<build#>.zip

# -*- coding: UTF-8 -*-
# 请看下面代码
import sqlite3
connent = sqlite3.connect("学生成绩管理.db")

#创建一个学生成绩管理表
cur = connent.execute('create table if not exists stuma(num integer primary key,name varchar(20),score integer)')
cur.close()

#增
def insert():
    num = int(input("请输入学号:"))
    name = input("请输入名字:")
    score = int(input("请输入成绩:"))
    cur = connent.execute('insert into stuma(num,name,score) values (?,?,?)',(num,name,score))
    connent.commit()
    cur.close()
#删
def delete():
    num = input("请输入需要删除的学号:")
    cur = connent.execute('select * from stuma where num=?',num)
    result = cur.fetchall()
    cur = connent.execute('delete from stuma where num=?',num)
    connent.commit()
    print('删除的数据为:',result)
    cur.close()

#查
def select():
    num = input('请输入需要查找的学号:')
    cur = connent.execute('select * from stuma where num=?',num)
    result = cur.fetchall()
    if len(result)!=0:
        print('查找的数据为;',result)
    else:
        print('查无此人')
    cur.close()

#改
def update():
    num = input('请输入需要更改的学号:')
    cur = connent.execute('select * from stuma where num=?',num)
    result = cur.fetchall()
    if len(result)!=0:
        name = input("修改的名字:")
        score = int(input("修改的成绩:"))
        print('修改前的数据为;\n',result)
        cur = connent.execute('update stuma set name=?,score=? where num=?',(name,score,num))
        connent.commit()
        cur = connent.execute('select * from stuma where num=?',num)
        result = cur.fetchall()
        print('修改后的数据为:\n',result)
    else:
        print('查无此人!')

    cur.close()

def showAll():
    cur = connent.execute('select * from stuma')
    result = cur.fetchall()
    if len(result)==0:
        print('无数据')
    else:
        for i in result:
            print(i)

    cur.close()

if __name__ == '__main__':
    window = '''
    增(按1)
    删(按2)
    查(按3)
    改 按4)
    查看所有(按5)
    退出(按6)
    '''


    while True:
        print(window)
        choise = int(input('请输入你的选择:'))
        if choise==1:
            insert()
        elif choise==2:
            delete()
        elif choise==3:
            select()
        elif choise==4:
            update()
        elif choise==5:
            showAll()
        elif choise==6:
            break
        else :
            pass
    print('使用结束')

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值