1. 前言

上篇文章 聊到 Python 处理 Mysql 数据库最常见的两种方式,本篇文章继续说另外一种比较常用的数据库:Sqlite

Sqlite 是一种 嵌入式数据库,数据库就是一个文件,体积很小,底层由 C 语言编写,经常被集成到移动应用程序中

事实上,Python 内置了 sqlite3 模块,不需要安装任何依赖,就可以直接操作 Sqlite 数据库

2. 准备

和 Python 操作 Mysql 类似,操作 Sqlite 主要包含下面 2 种方式:

  • sqlite3 + 原生 SQL

  • SQLAlchemy + ORM

3. sqlite3 + 原生 SQL

由于 Python 内置了 sqlite3 模块,这里直接导入就可以使用了

# 导入内置模块sqlite3
import sqlite3

首先,我们使用 sqlite3 的 connnect() 方法创建一个数据库连接对象,如果数据库不存在,就自动在对应目录下新建一个数据库文件

# 创建数据库连接对象,如果数据库不存在,就自动新建一个数据库文件
# 还可以指定其他参数,包含:超时时间
self.conn = sqlite3.connect(self.path_db)

然后,通过数据库连接对象获取一个操作数据库的 游标实例

# 获取操作数据库的游标对象
self.cursor = self.conn.cursor()

接着,使用数据库连接对象执行创建表的 SQL 语句,在数据库内新建一张表

# 创建表
SQL_CREATE_TABLE = '''CREATE TABLE IF NOT EXISTS PEOPLE
(ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL);''' def create_db_table(self):
"""
初始化表
:return:
"""
self.conn.execute(SQL_CREATE_TABLE)

接下来,我们通过增删改查来操作数据表

1、新增

同样以新增单条数据和多条数据为例

对于单条数据的插入,只需要编写一条插入的 SQL 语句,然后作为参数执行上面数据库连接对象的 execute(sql) 方法,最后使用数据库连接对象的 commit() 方法将数据提交到数据库中

# 插入一条数据
SQL_INSERT_ONE_DATA = "INSERT INTO PEOPLE(id,name,age) VALUES(3,'xag',23);" def insert_one(self):
"""新增一条数据"""
try:
self.conn.execute(SQL_INSERT_ONE_DATA)
# 必须要提交,才能正确执行
self.conn.commit()
except Exception as e:
self.conn.rollback()
print('插入一条记录失败,回滚~')

需要注意的是,插入操作经常会因为主键原因导致新增异常,所以需要捕获异常,执行回滚操作

使用数据库连接对象的 executemany() 方法,传入插入的 SQL 语句及 位置变量列表,可以实现一次插入多条数据

# 插入多条数据(3个变量,包含:id、name、value)
SQL_INSERT_MANY_DATA = 'INSERT INTO PEOPLE (id,name,age) VALUES(?,?,?);' # 待插入的数据
self.data = [(4, '张三', 11), (5, '李四', 12), (6, '王五', 13)] def insert_many(self, data):
"""新增多条数据"""
try:
self.conn.executemany(SQL_INSERT_MANY_DATA, data)
self.conn.commit()
except Exception as e:
self.conn.rollback()
print('插入多条记录失败,回滚~')

2、查询

查询分为 2 步,分别是:

  • 通过游标对象执行查询的 SQL 语句

  • 调用游标对象的方法获取查询结果

比如:

要获取所有数据,可以使用游标对象的 fetchall() 方法

要获取第一条满足条件的数据,可以使用 fetchone() 方法

另外,fetchmany(num) 可以查询固定数量的数据

# 查询的SQL语句
SQL_QUERY_ONE_DATA = "SELECT * FROM PEOPLE WHERE id={}" def query_one(self, id):
"""
查询一条数据
:param id:
:return:
"""
self.cursor.execute(SQL_QUERY_ONE_DATA.format(id)) # fetchone():查询第一条数据
# fetchall():查询所有数据
# fetchmany(1):查询固定的数量的数据
result = self.cursor.fetchall()
print(type(result))
print(result)

3、更新

和 新增操作 类似,更新操作也是通过数据库连接对象去执行更新的 SQL 语句,最后执行提交操作,将数据真实更新到数据表中

以更新某一条记录为例

# 更新数据
SQL_UPDATE_ONE_DATA = "UPDATE PEOPLE SET NAME = '{}',AGE={} where id = {}" def update_one(self, id, name, age):
"""
修改一条记录
:param id:
:param name:
:param age:
:return:
"""
sql_update = SQL_UPDATE_ONE_DATA.format(name, age, id)
print(sql_update)
self.conn.execute(sql_update)
self.conn.commit()

4、删除

删除操作同查询、新增操作类似,只需要执行删除的 SQL 语句即可

以删除某一条记录为例

# 删除数据
SQL_DEL_ONE_DATA = "DELETE FROM PEOPLE where id ={}" def del_one(self, id):
"""通过id去删除一条数据"""
sql_del = SQL_DEL_ONE_DATA.format(id)
self.conn.execute(sql_del)
self.conn.commit()

最后,我们同样需要将游标对象和数据库连接对象,资源释放

def teardown(self):
# 关闭游标和数据库连接,避免资源浪费
self.cursor.close()
self.conn.close()

4. SQLAlchemy + ORM

使用 SQLAlchemy 操作 sqlite 数据库同样先需要安装依赖库

# 安装依赖包
pip3 install sqlalchemy

通过内置方法 declarative_base() 创建一个基础类 Base

然后,自定义一个 Base 类的子类,内部通过定义静态变量指定表名、表的字段

from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base # 基础类
Base = declarative_base() # 自定义的表
class People(Base):
# 表名
__tablename__ = 'people' # 定义字段
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer) def __repr__(self):
"""
便于打印结果
:return:
"""
return "<People(id:{},name:{},age:{})".format(self.id, self.name, self.age)

接着,通过 SQLAlchemy 的 create_engine(sqlite数据库路径) 方法中创建数据库连接对象

格式为:sqlite:///数据库相对路径

# 创建数据库连接
engine = create_engine('sqlite:///./xh.db', echo=True)

最后,通过数据库引擎在数据库中创建表结构,并实例化一个 数据库会话对象

PS:数据库会话对象内置的方法非常方便我们进行增删改查操作

# 创建表结构
# checkfirst:判断表是否存在,如果存在,就不重复创建
Base.metadata.create_all(engine, checkfirst=True) # 实例化会话
self.session = sessionmaker(bind=engine)()

这样所有的准备工作已经完成,接下来可以进行增删改查操作了

1、新增

新增操作同样以新增一条和多条记录为例,它们分别对应会话对象的 add()、add_all() 方法

对于一条记录的新增操作,只需要实例化一个 People 对象,执行上面的会话对象的 add(instance) 和 commit() 两个方法,即可以将数据插入到数据表中

def add_one_data(self):
"""新增一条数据"""
# 创建一个表的实例对象
people = People(name='xag1', age=24)
self.session.add(people) # 必须提交,才能更新到数据库中
self.session.commit()

如果需要一次插入多条数据,只需要调用 add_all(列表数据) 即可

def add_datas(self, data):
"""
新增多条数据
:return:
"""
self.session.add_all(data)
self.session.commit()

2、查询

查询数据表的操作对应会话对象的 query() 方法

同时,还可以结合 all()、first()、filter_by(限制条件) 级联方法限制要查询的数据

以查询所有记录和根据 id 查询一条记录为例

def query_one_data(self, id):
"""
通过id去查询一条数据
:param id:
:return:
"""
# 通过id去查询数据,取第一条
people = self.session.query(People).filter_by(id=id).first()
print(people)
print(type(people)) def query_all(self):
"""
查询所有数据
:return:
"""
peoples = self.session.query(People).all()
print(peoples)
print(type(peoples))

3、更新

更新操作一般做法是:

  • query 查询出待更新的对象

  • 直接更新对象中的数据

  • 使用会话对象提交修改,完成更新操作

def update1(self, id, name, age):
"""
更新记录
:param id:
:param name:
:param age:
:return:
"""
# 更新步骤:先查询、修改数据、然后确认修改
people_temp = self.session.query(People).filter_by(id=id).first() # 修改数据
people_temp.name = name
people_temp.age = age # 确认提交修改
self.session.commit()

需要指出的是,这里也可以使用内置方法 update() ,对上面的更新操作进行简写

def update2(self, id, name, age):
"""
更新记录方法2
:param id:
:param name:
:param age:
:return:
"""
self.session.query(People).filter_by(id=id).update({People.name: name, People.age: age})
self.session.commit()

4、删除

和更新操作一样,删除操作也有两种实现方式

第一种方式的思路是,先查询,后删除,最后提交会话完成删除操作

以按照 id 删除某一条记录为例:

def del_one_data1(self, id):
"""
删除一条数据方法1
:param id:
:return:
"""
people_temp = self.session.query(People).filter_by(id=id).first() # 判断是否为空
if people_temp is not None:
self.session.delete(people_temp)
self.session.commit()
else:
print('此条记录不存在,删除失败!')

需要注意的是,查询的结果必须判断是否为空,否则直接执行删除操作,可以会抛出异常

另外一种方式是,直接使用级联函数将上面的删除操作进行简写

def del_one_data2(self, id):
"""
删除一条数据方法2
:param id:
:return:
"""
try:
self.session.query(People).filter_by(id=id).first().delete()
except Exception as e:
print('删除失败')

同样,这种删除操作需要捕获异常,避免查询的结果为空的情况

最后,完成所有操作之后,我们需要结束会话、销毁数据库引擎

def teardown(self):
"""
释放资源
:return:
"""
# 结束会话
self.session.close() # 销毁引擎
self.engine.dispose()

5.最后

本篇文章通过一张表的增删改查,详细讲解了 Python 操作 sqlite 的两种使用方式

我已经将文中全部源码上传到后台,关注公众号「 AirPython 」后回复「 dball 」即可获得全部源码

如果你觉得文章还不错,请大家 点赞、分享、留言下,因为这将是我持续输出更多优质文章的最强动力!

推荐阅读

聊聊 Python 数据处理全家桶(Mysql 篇)

Python 如何使用 HttpRunner 做接口自动化测试

Python 自动化,Helium 凭什么取代 Selenium?

最全总结 | 聊聊 Python 数据处理全家桶(Sqlite篇)的更多相关文章

  1. 最全总结 | 聊聊 Python 数据处理全家桶(PgSQL篇)

    1. 前言 大家好,我是安果! Python 数据处理全家桶,截止到现在,一共写过 6 篇文章,有兴趣的小伙伴可以去了解一下! 最全总结 | 聊聊 Python 数据处理全家桶(Mysql 篇) 最全 ...

  2. 最全总结 | 聊聊 Python 数据处理全家桶(Redis篇)

    1. 前言 前面两篇文章聊到了 Python 处理 Mysql.Sqlite 数据库常用方式,本篇文章继续说另外一种比较常用的数据存储方式:Redis Redis:Remote Dictionary ...

  3. 最全总结 | 聊聊 Python 数据处理全家桶(Memcached篇)

    1. 前言 本篇文章继续继续另外一种比较常用的数据存储方式:Memcached Memcached:一款高性能分布式内存对象缓存系统,通过 内存缓存,以减少数据库的读取,从而分担数据库的压力,进而提高 ...

  4. 最全总结 | 聊聊 Python 数据处理全家桶(配置篇)

    1.前言 在实际项目中,经常会接触到各种各样的配置文件,它可以增强项目的可维护性 常用配件文件的处理方式,包含:JSON.ini / config.YAML.XML 等 本篇文章,我们将聊聊 Pyth ...

  5. 最全总结 | 聊聊 Python 数据处理全家桶(Mysql 篇)

    1. 前言 在爬虫.自动化.数据分析.软件测试.Web 等日常操作中,除 JSON.YAML.XML 外,还有一些数据经常会用到,比如:Mysql.Sqlite.Redis.MongoDB.Memch ...

  6. 最全总结 | 聊聊 Python 办公自动化之 Excel(中)

    1. 前言 上一篇文章中,我们聊到使用 xlrd.xlwt.xlutils 这一组合操作 Excel 的方法 最全总结 | 聊聊 Python 办公自动化之 Excel(上) ​本篇文章将继续聊另外一 ...

  7. 最全总结 | 聊聊 Python 办公自动化之 Excel(上)

    1. 前言 在我们日常工作中,经常会使用 Word.Excel.PPT.PDF 等办公软件 但是,经常会遇到一些重复繁琐的事情,这时候手工操作显得效率极其低下:通过 Python 实现办公自动化变的很 ...

  8. 最全总结 | 聊聊 Python 办公自动化之 Excel(下)

    1. 前言 前面谈到 Python 处理 Excel 文件最常见的两种方式,即:xlrd/xlwt.openpyxl ​其中, xlrd/xlwt 这一组合,xlrd 可以负责读取数据,而 xlwt ...

  9. 最全总结 | 聊聊 Python 办公自动化之 Word(上)

    1. 前言 日常自动化办公中,使用 Python 真的能做到事半功倍! 在上一个系列中,我们对 Python 操作 Excel 进行了一次全面总结 最全总结 | 聊聊 Python 办公自动化之 Ex ...

随机推荐

  1. java class类和object类

    Class类 介绍 Java的Class类是java反射机制的基础,通过Class类我们可以获得关于一个类的相关信息 Java.lang.Class是一个比较特殊的类,它用于封装被装入到JVM中的类( ...

  2. 2020.5.27 第七篇 Scrum冲刺博客

    Team:银河超级无敌舰队 Project:招新通 项目冲刺集合贴:链接 目录 一.每日站立会议 1.1 会议照片 1.2 项目完成情况 二.项目燃尽图 三.签入记录 3.1 代码/文档签入记录 3. ...

  3. SNN对抗攻击笔记

    SNN对抗攻击笔记: 1. 解决SNN对抗攻击中脉冲与梯度数据格式不兼容性以及梯度消失问题: G2S Converter.Gradient Trigger[1] 2. 基于梯度的对抗攻击方式: FGS ...

  4. python chardet模块查看字符编码方式

    电脑配置:联想笔记本电脑 windows8系统 Python版本:2.7.8 本文章撰写时间:2014.12.25 作者:陈东陈 阅读说明: 1.本文都是先解释,后放图片: 2.文中斜体部分要么为需要 ...

  5. 牛客网PAT-练兵场-挖掘机技术哪家强

    题目地址:https://www.nowcoder.com/pat/6/problem/4058 题解:用数组下标当学校编号.输入一次数据的时候,直接在相应数组下标位置累加内容,同时更新最大的总分的学 ...

  6. Redis入门--进阶详解

    Redis NoSql入门和概述 入门概述 互联网时代背景下大机遇,为什么用nosql 1.单机MySQL的美好年代 在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付,在那个时候, ...

  7. Flying Pages:在单击之前预加载页面,打开网页快得飞起

    Flying Pages能够实现:在用户点击网页的链接之前,就预加载这个网页,当再点击这个网页时,页面便能飞速打开,能为网站优化加分.接下来,就由LOYSEO来讲解Flying Pages的使用方法. ...

  8. SpringBoot中关于Excel的导入和导出

    前言   由于在最近的项目中使用Excel导入和导出较为频繁,以此篇博客作为记录,方便日后查阅.本文前台页面将使用layui,来演示对Excel文件导入和导出的效果.本文代码已上传至我的gitHub, ...

  9. 使用Arcgis时,在sde空间库常用的相关函数

    一.Oracle库中配置好sde空间库常见的场景 1.在sde库中创建表:community 创建表:community 字段:id(INTEGER), shape(ST_GEOMETRY) 2.往s ...

  10. [ASP.NET Core开发实战]基础篇06 配置

    配置,是应用程序很重要的组成部分,常常用于提供信息,像第三方应用登录钥匙.上传格式与大小限制等等. ASP.NET Core提供一系列配置提供程序读取配置文件或配置项信息. ASP.NET Core项 ...