点击上方“AirPython”,选择“加为星标”

第一时间关注 Python 技术干货!

1. 前言

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

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

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

2. 准备

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

  • sqlite3 + 原生 SQL

  • SQLAlchemy + ORM

3. sqlite3 + 原生 SQL

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

# 导入内置模块sqlite3import 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_enginefrom 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 ".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 的两种使用方式

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

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

留言送书本周赠书:《Python数据分析全流程PS:中奖名单将于下周一在交流群公布内容全面:借助 5 大 Python 工具库,实现数据分析从获取到建模全流程覆盖贴合实际:不空讲 Python 语法,清晰简明地介绍如何用 Python 来处理、分析数据热点案例:覆盖 6 大热点应用领域,可直接参考研发,实现数据变现学习资源:提供所有案例源代码和数据,供读者操作练习,快速上手推荐阅读聊聊 Python 数据处理全家桶(Mysql 篇)Python 如何使用 HttpRunner 做接口自动化测试Python 自动化,Helium 凭什么取代 Selenium?

insert into 多条数据_最全总结 | 聊聊 Python 数据处理全家桶(Sqlite篇)相关推荐

  1. mysql打印语句_最全总结 | 聊聊 Python 数据处理全家桶(Mysql 篇)

    点击上方"AirPython",选择"加为星标" 第一时间关注 Python 技术干货! 1. 前言 在爬虫.自动化.数据分析.软件测试.Web 等日常操作中, ...

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

    聊聊 Python 数据处理全家桶(Memca 篇) 点击上方"菜鸟学Python",选择"星标"公众号 重磅干货,第一时间送达 1.前言 在实际项目中,经常会 ...

  3. python json key_最全总结 | 聊聊 Python 数据处理全家桶(配置篇)

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

  4. python中计算带分数_聊聊 python 数据处理全家桶(Redis篇)

    作者:星安果 来源:AirPython 前面两篇文章聊到了 python 处理 Mysql.Sqlite 数据库常用方式,本篇文章继续说另外一种比较常用的数据存储方式:Redis Redis:Remo ...

  5. python办公自动化博客_最全总结 | 聊聊 Python 办公自动化之 Word(下)

    1. 前言 关于 Word 文档的读写,前面两篇文章分别进行了一次全面的总结 最全总结 | 聊聊 Python 办公自动化之 Word(上) 最全总结 | 聊聊 Python 办公自动化之 Word( ...

  6. layui中table监听单元格_最全总结 | 聊聊 Python 办公自动化之 PPT(中)

    点击上方 "AirPython",选择 "加为星标" 第一时间关注 Python 技术干货! 1. 前言 上一篇文章简单地介绍了 PPT 的文档结构,并使用 p ...

  7. insert into 多条数据_「数据库」一千行MySQL命令

    基本操作 /* Windows服务 */-- 启动MySQL net start mysql-- 创建Windows服务 sc create mysql binPath= mysqld_bin_pat ...

  8. python开源oa系统_最全总结 | 聊聊 Python 办公自动化之 Word(下)

    1. 前言 关于 Word 文档的读写,前面两篇文章分别进行了一次全面的总结 本篇文章作为一个办公自动化 Word 篇的一个补充,写写几个比较实用的办公场景 包含: 页眉页脚处理 合并多个文档 新增数 ...

  9. python办公自动化价值是什么意思_最全总结 | 聊聊 Python 办公自动化之 Word(中)...

    1. 前言 上一篇文章,对 Word 写入数据的一些常见操作进行了总结 相比写入数据,读取数据同样很实用! 本篇文章,将谈谈如何全面读取一个 Word 文档中的数据,并会指出一些要注意的点 2. 基本 ...

最新文章

  1. 编写Java 制作留言板_JSP+Servlet+JavaBean制作简单留言板
  2. 增大iphone音量技巧_原来苹果手机隐藏功能这么好用!调整这个设置,一键增大外放音量...
  3. 2019吉首大学计算机调剂,吉首大学2019年硕士研究生调剂考生复试情况分学院公示...
  4. 【牛客 - 181B】送分题(另类求解a+b,二分)
  5. UE4手册中文翻译速查表
  6. jpg怎么合成一份_海外商标注册申请程序复杂吗?应该怎么注册?
  7. HTML的基本知识(六)——表格的基本属性之实现个人简历
  8. sublime cscope使用方法
  9. ue4蓝图碰撞检测的类型_UE4_自定义相机碰撞组件
  10. 3dmax shift用来复制对象
  11. UGUI 图片灰显裁剪
  12. MySQL的replace()函数
  13. 一种保护应用程序的方法 模拟Windows PE加载器,从内存资源中加载DLL
  14. 启动报错:Unsatisfied dependency expressed through field ‘baseMapper‘
  15. ArcGIS多种面积计算方法的区别
  16. 在拍拍二手爱回收出过一次手机后,我才体验到回收二手的快乐
  17. linux中的lnk格式,ink文件扩展名,ink文件怎么打开?
  18. 首字母排序侧边索引栏:WaveSideBar的简单使用
  19. Android一键锁屏功能的实现
  20. MYSQL索引的作用以及如何创建索引

热门文章

  1. Button的使用(二):从资源文件中
  2. 题目1103:二次方程计算器
  3. 廖雪峰Java2面向对象编程-4抽象类和接口-1抽象类
  4. 常用深度学习模型介绍(1)
  5. 过河 2005年NOIP全国联赛提高组(离散化+dp)
  6. LiveBos---扩展按钮调用方法
  7. Java学习笔记之:Java JDBC
  8. php_yaf 安装
  9. Fragment之间的通信
  10. windows下GIT使用记录--00准备阶段