首页 > 技术文章 > python操作轻量级数据库sqlite

zibinchen 2021-08-03 09:46 原文

SQLite简介


SQLite数据库是一款非常小巧的嵌入式开源数据库软件,也就是说没有独立的维护进程,所有的维护都来自于程序本身。它是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月. 至今已经有10个年头,SQLite也迎来了一个版本 SQLite 3已经发布。

功能特性

  • ACID事务
  • 零配置 – 无需安装和管理配置
  • 支持数据库大小至2TB
  • 比一些流行的数据库在大部分普通数据库操作要快
  • 独立: 没有额外依赖
  • 支持多种开发语言,C, C++, PHP, Perl, Java, C#,Python, Ruby等

数据类型

  • Typelessness(无类型)
  • 支持常用的数据库类型

python操作SQLite

Python2.5之后,内置了SQLite3,成为了内置模块

import sqlite3

创建/打开数据库

如果数据库不存在就会创建新的数据库

# 可以指定创建数据库的路径,比如可以写成sqlite3.connect(r"E:\DEMO.db")
con = sqlite3.connect("DEMO.db")

也可以创建数据库在内存中

con = sqlite3.connect(":memory:")

数据库连接对象

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

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

关于commit(),如果isolation_level隔离级别默认,那么每次对数据库的操作,都需要使用该命令,你也可以设置isolation_level=None,这样就变为自动提交模式。

创建游标

我们需要使用游标对象SQL语句查询数据库,获得查询对象。 通过以下方法来定义一个游标。

cu=con.cursor()

游标对象有以下的操作:

  1. execute()--执行sql语句
  2. executemany--执行多条sql语句
  3. close()--关闭游标
  4. fetchone()--从结果中取一条记录,并将游标指向下一条记录
  5. fetchmany()--从结果中取多条记录
  6. fetchall()--从结果中取出所有记录
  7. scroll()--游标滚动

CURD操作

创建表

sql = "CREATE TABLE IF NOT EXISTS test(id INTEGER PRIMARY KEY,name TEXT,age INTEGER)"
cu.execute(sql)
# or
cu.execute("create table catalog (id integer primary key,pid integer,name varchar(10) UNIQUE,nickname text NULL)")

创建了一个叫catalog的表,它有一个主键id,一个pid,和一个name,name是不可以重复的,以及一个nickname默认为NULL

添加数据

# ①:添加单条数据
data = "1,'Desire',5"
cu.execute('INSERT INTO test VALUES (%s)' % data)
# ②:添加单条数据
cu.execute("INSERT INTO test values(?,?,?)", (6, "zgq", 20))
# ③:添加多条数据
cu.executemany('INSERT INTO test VALUES (?,?,?)', [(3, 'name3', 19), (4, 'name4', 26)])

简单的插入两行数据,不过需要提醒的是,只有提交了之后,才能生效.我们使用数据库连接对象con来进行提交commit和回滚rollback操作.

con.commit()

更新数据

# 方式一
cu.execute("UPDATE test SET name=? WHERE id=?", ("nihao", 1))
# 方式二
cu.execute("UPDATE test SET name='haha' WHERE id=3")

con.commit()

删除数据

# 方式一
cu.execute("DELETE FROM test WHERE id=?", (1,))
# 方式二
cu.execute("DELETE FROM test WHERE id=3")

con.commit()


id为1、3的数据都被删除了

查询数据

查询所有数据

cu.execute('select * from test')
print(cu.fetchall())
[(1, 'Desire', 5), (3, 'name3', 19), (4, 'name4', 26), (6, 'zgq', 20)]

查询单条数据

cu.execute('select * from test')
print('单条数据:',cu.fetchone())
单条数据: (1, 'Desire', 5)

查询多条数据

cu.execute('select * from test')
print('多条数据:',cu.fetchmany(3))
多条数据: [(1, 'Desire', 5), (3, 'name3', 19), (4, 'name4', 26)]

事务提交、回滚

提交

con.commit()

回滚

con.rollback()

断开会话连接,释放资源

# 关闭游标
cur.close()
# 断开数据库连接
con.close()

推荐阅读