前言

提到数据库,首先会想到的就是MySql,作为最流行的关系型数据库,凭借其体积小、速度快、开源免费等优点,得到了开发者们的青睐,普遍应用于中小型网站和小规模公司的数据管理业务中。

而有些场景下,开发者们会需要一种更加轻便的数据库,用于非中心化地存储一些配置信息、使用信息等,例如一些客户端软件的用户配置信息需要存储到用户本地,而用户系统中一般是不会搭建数据库服务的。

因此,SQLite应运而生。

 

SQLite介绍

SQLite是一个无服务器的、零配置的、事务性的 SQL 数据库引擎。

无服务器和零配置意味着与其他数据库不同,其他数据库在使用前都需要先在服务器搭建数据库服务,并且需要保持服务或者进程在后台持续运行。

SQLite不是一个独立的服务或者进程,而是一个数据库存储文件,其他的程序或者编程语言可以通过特定的方式直接访问这个存储文件使用数据库。

如果实在没有可以访问数据库文件的程序或者编程语言,可以从SQLite下载页面下载安装SQLite软件使用。

SQLite的优点如下

  • 不需要一个单独的服务器进程或操作的系统(无服务器)

  • SQLite 不需要配置,不需要安装或管理(零配置)

  • 一个完整的 SQLite 数据库是存储在单一的磁盘文件中

  • 支持数据库体积最大到2TB
  • SQLite 是轻量级的,完全配置时小于 400KB,省略可选功能配置时小于250KB

  • SQLite 是自给自足的,不需要任何外部的依赖

  • SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问

  • SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能

  • SQLite 使用 ANSI-C 编写,并提供了简单和易于使用的 API

  • 支持多种开发语言,C, C++, PHP, Perl, Java, C#,Python,Ruby等

  • SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中运行

 

SQLite的基础命令

SQLite的命令和MySql的非常相似,常用的例如

  • CREATE  创建表、视图等对象
  • ALTER  修改数据库中某个已有的对象
  • DROP  删除表、视图等对象
  • INSERT  创建记录
  • UPDATE  修改记录
  • DELETE  删除记录
  • SELECT  从一个表或者多个表中检索记录
  • PRAGMA  控制SQLite环境中的各种环境变量和状态标志
  • COPY  复制对象或者记录

 

SQLite可视化工具

首先推荐的可视化工具就是sqliteviz,无需安装,直接打开网页,上传db文件就可以使用,也支持csv文件的可视化,简单方便。

其次是sqlitebrowser,虽然需要安装,但胜在功能更强大,如果需要经常查看数据库的话推荐使用。

最后还有绕不过的Navicat家的Navicat for SQLite,优点是界面美观,功能强大,缺点则是需要付费或者和谐了。

 

Python操作SQLite

Python 在2.5版本以上就已经内置了 sqlite3库 ,因此在Python中可以直接使用SQLite。

 

导入sqlite3库

导入方式很简单,直接import即可。

import sqlite3

 

建立数据库连接

数据库建立连接方法如下

con=sqlite3.connect("yumefx.db")

如果db文件不存在的话会自动创建,建立连接成功后会返回一个connection对象。

可以使用 :memory: 来在 RAM 中打开一个到 database 的数据库连接,而不是在磁盘上打开。

当一个数据库被多个连接访问,且其中一个修改了数据库,此时 SQLite 数据库被锁定,直到事务提交。

 

创建游标对象

cur=con.cursor()

 

执行SQL命令

使用游标对象的execute方法可以执行SQL命令

cur.execute("create table if not exists book(id primary key,name,tel)")

也可以通过executemany方法批量执行多条SQL命令

cur.executemany("insert into book(id,name,tel) values(?,?,?)",[("book1","KON",18), ("book2","SOX",24)])

还可以通过executescript方法执行一个SQL脚本,脚本中每个SQL命令之间记得用;隔开。

 

数据库提交和回滚

con.commit()
con.rollback()

注意提交事务和回滚操作是对数据库的操作,只有数据库的connection对象才具有提交commit和回滚rollback的两个方法,不要与游标对象混淆。

 

获取游标对象的查询结果

cur.execute("select id,name,tel from book")
for row in cur:
    print(row)

还可以通过fetchone()、fetchmany(size)、fetchall()方式,根据游标现在的位置进行查询结果的遍历。

cur.execute("select id,name,tel from book")
print(cur.fetchone())
print(cur.fetchmany(3))
print(cur.fetchall())

使用cursor对象执行select语句时,使用fetchcall方法返回的是查询结果集。结果集是一个list,每个元素都是一个tuple,对应一行记录,按建表的字段顺序排列。

fetchone只返回一条结果,是一个tuple,每个元素是一个字段值。

需要注意的是,SQLite游标是有状态的,只能遍历结果集一次,不能在结果集中返回移动,遍历结束会返回空值。

 

关闭游标对象和数据库连接

cur.close() #关闭游标对象
con.close() #关闭connection对象

世上的人大半不会用自己的脑袋思考,
而且越是不思考的人,越不愿倾听别人说话。

《IQ84》
——村上春树