最全总结 | 聊聊 Python 数据处理全家桶(Sqlite篇)
1. 前言
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 = namepeople_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 的两种使用方式
我已经将文中全部源码上传到后台,关注公众号后回复「 813 」即可获得全部源码
如果你觉得文章还不错,请大家 三连一下,因为这将是我持续输出更多优质文章的最强动力!
推荐阅读:入门: 最全的零基础学Python的问题 | 零基础学了8个月的Python | 实战项目 |学Python就是这条捷径干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 | 从万众期待到口碑扑街!唐探3令人失望 | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影趣味:弹球游戏 | 九宫格 | 漂亮的花 | 两百行Python《天天酷跑》游戏!AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!| 再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|年度爆款文案1).卧槽!Pdf转Word用Python轻松搞定!2).学Python真香!我用100行代码做了个网站,帮人PS旅行图片,赚个鸡腿吃3).首播过亿,火爆全网,我分析了《乘风破浪的姐姐》,发现了这些秘密 4).80行代码!用Python做一个哆来A梦分身 5).你必须掌握的20个python代码,短小精悍,用处无穷 6).30个Python奇淫技巧集 7).我总结的80页《菜鸟学Python精选干货.pdf》,都是干货 8).再见Python!我要学Go了!2500字深度分析!9).发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片
点阅读原文,领AI全套资料!
最全总结 | 聊聊 Python 数据处理全家桶(Sqlite篇)相关推荐
- insert into 多条数据_最全总结 | 聊聊 Python 数据处理全家桶(Sqlite篇)
点击上方"AirPython",选择"加为星标" 第一时间关注 Python 技术干货! 1. 前言 上篇文章 聊到 Python 处理 Mysql 数据库最常 ...
- python json key_最全总结 | 聊聊 Python 数据处理全家桶(配置篇)
1.前言 在实际项目中,经常会接触到各种各样的配置文件,它可以增强项目的可维护性 常用配件文件的处理方式,包含:JSON.ini / config.YAML.XML 等 本篇文章,我们将聊聊 Pyth ...
- 最全总结 | 聊聊 Python 数据处理全家桶(配置篇)
聊聊 Python 数据处理全家桶(Memca 篇) 点击上方"菜鸟学Python",选择"星标"公众号 重磅干货,第一时间送达 1.前言 在实际项目中,经常会 ...
- mysql打印语句_最全总结 | 聊聊 Python 数据处理全家桶(Mysql 篇)
点击上方"AirPython",选择"加为星标" 第一时间关注 Python 技术干货! 1. 前言 在爬虫.自动化.数据分析.软件测试.Web 等日常操作中, ...
- python中计算带分数_聊聊 python 数据处理全家桶(Redis篇)
作者:星安果 来源:AirPython 前面两篇文章聊到了 python 处理 Mysql.Sqlite 数据库常用方式,本篇文章继续说另外一种比较常用的数据存储方式:Redis Redis:Remo ...
- excel 图片转url_最全总结 | 聊聊 Python 办公自动化之 Excel(下)
聊聊 Python 数据处理全家桶(Memca 篇) 点击上方"AirPython",选择"加为星标" 第一时间关注 Python 技术干货! 1. 前言 前面 ...
- 最全总结 | 聊聊 Python 办公自动化之 Word(中)
聊聊 Python 数据处理全家桶(Memca 篇) 点击上方"AirPython",选择"加为星标" 第一时间关注 Python 技术干货! 1. 前言 上一 ...
- 最全总结 | 聊聊 Python 办公自动化之 PPT(上)
聊聊 Python 数据处理全家桶(Memca 篇) 点击上方"AirPython",选择"加为星标" 第一时间关注 Python 技术干货! 1. 前言 自动 ...
- layui中table监听单元格_最全总结 | 聊聊 Python 办公自动化之 PPT(中)
点击上方 "AirPython",选择 "加为星标" 第一时间关注 Python 技术干货! 1. 前言 上一篇文章简单地介绍了 PPT 的文档结构,并使用 p ...
- python办公自动化博客_最全总结 | 聊聊 Python 办公自动化之 Word(下)
1. 前言 关于 Word 文档的读写,前面两篇文章分别进行了一次全面的总结 最全总结 | 聊聊 Python 办公自动化之 Word(上) 最全总结 | 聊聊 Python 办公自动化之 Word( ...
最新文章
- 全息技术“量子飞跃”或彻底改变成像技术
- Postman--Pre-request执行其他接口
- 智能合约重构社会契约 (3)智能合约的自动触发
- spring @lazy_Spring @Lazy批注用例
- PAT_1032验证身份(15)
- html5 sha1,JavaScript 实现的base64加密、md5加密、sha1加密及AES加密
- 关于semantic-ui的cdn失效问题(怎样通过本地引用semantic-ui)
- NeoKylin中标麒麟系统用户和组的管理命令
- MySQL数据库实操教程(24)——用户管理
- 微信与企业微信消息如何互通?
- index和match函数
- 程序员不做独行侠——沟通的核心是感受
- 手机断触怎么办_手机触摸屏失灵了怎么办,五种方法自己就能修好它!
- Autovue显示dwg等图纸乱码问题解决
- 一条SQL语句查询所有任务分数都在60以上的用户名字
- scanf和cin的返回值问题
- 论文阅读报告 Traffic-Based Dynamic Beam Coverage Adjustment in Satellite Mobile Communication
- 程序员吃饭段子Java吃完就走_程序员专用段子笑话,笑话死循环
- 卡特兰数 二叉树相关公式 二叉树ADT操作
- 计算机控制实验ppt模板,2016计算机控制实验-PPT.ppt
热门文章
- java mschart_关于vb中MSCHART控件画二维线图 - conkeyn - JavaEye技术网站
- weblogic linux安装包下载,weblogic 8.1.6 for linux安装.doc
- weblogic下载安装
- 产品配件类目税目分类_HS编码知识:汽车零部件怎么归类?
- linux系统iso文件详解,ISO镜像文件解析
- 一个程序员的书法学习之路-法帖篇
- python的装饰器和find函数的使用
- cocos2d-x 使用BMFont生成中文字体并应用
- 推荐一款好用的加密软件 filepackage 文件加密 U盘加密 移动硬盘加密
- curviloft插件怎么用_Curviloft (曲线放样) v1.8a