作者:星安果
来源:AirPython
聊到 python中的Redis,本篇文章继续说另外一种比较常用的数据库:Sqlite。
Sqlite 是一种 嵌入式数据库,数据库就是一个文件,体积很小,底层由 C 语言编写,经常被集成到移动应用程序中事实上,python 内置了 sqlite3 模块,不需要安装任何依赖,就可以直接操作 Sqlite 数据库
——准备
和 Python 操作 Mysql 类似,操作 Sqlite 主要包含下面 2 种方式:
——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 步,分别是:
比如:
要获取所有数据,可以使用游标对象的 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()
——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 "接着,通过 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()本篇文章通过一张表的增删改查,详细讲解了 python 操作 sqlite 的两种使用方式。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
“用户旅程分析”概念 用户旅程图又叫做用户体验地图,它是用于描述用户在与产品或服务互动的过程中所经历的各个阶段、触点和情 ...
2025-01-22在竞争激烈的商业世界中,竞品分析对于企业的发展至关重要。今天,我们就来详细聊聊数据分析师写竞品分析的那些事儿。 一、明确 ...
2025-01-22在数据分析领域,Excel作为一种普及率极高且功能强大的工具,无疑为无数专业人士提供了便捷的解决方案。尽管Excel自带了丰富的功 ...
2025-01-17在这个瞬息万变的时代,许多人都在寻找能让他们脱颖而出的职业。而数据分析师,作为大数据和人工智能时代的热门职业,自然吸引了 ...
2025-01-14Python作为一门功能强大的编程语言,已经成为数据分析和可视化领域的重要工具。无论你是数据分析的新手,还是经验丰富的专业人士 ...
2025-01-10完全靠数据决策,真的靠谱吗? 最近几年,“数据驱动”成了商界最火的关键词之一,但靠数据就能走天下?其实不然!那些真正成功 ...
2025-01-09SparkSQL 结构化数据处理流程及原理是什么?Spark SQL 可以使用现有的Hive元存储、SerDes 和 UDF。它可以使用 JDBC/ODB ...
2025-01-09在如今这个信息爆炸的时代,数据已然成为企业的生命线。无论是科技公司还是传统行业,数据分析正在深刻地影响着商业决策以及未来 ...
2025-01-08“数据为王”相信大家都听说过。当前,数据信息不再仅仅是传递的媒介,它成为了驱动经济发展的新燃料。对于企业而言,数据指标体 ...
2025-01-07在职场中,当你遇到问题的时候,如果感到无从下手,或者抓不到重点,可能是因为你掌握的思维模型不够多。 一个好用的思维模型, ...
2025-01-06在现代企业中,数据分析师扮演着至关重要的角色。每天都有大量数据涌入,从社交媒体到交易平台,数据以空前的速度和规模生成。面 ...
2025-01-06在职场中,许多言辞并非表面意思那么简单,有时需要听懂背后的“潜台词”。尤其在数据分析的领域里,掌握常用术语就像掌握一门新 ...
2025-01-04在当今信息化社会,数据分析已成为各行各业的核心驱动力。它不仅仅是对数字进行整理与计算,而是在数据的海洋中探寻规律,从而指 ...
2025-01-03又到一年年终时,各位打工人也迎来了展示成果的关键时刻 —— 年终述职。一份出色的年终述职报告,不仅能全面呈现你的工作价值, ...
2025-01-03在竞争激烈的商业世界中,竞品分析对于企业的发展至关重要。今天,我们就来详细聊聊数据分析师写竞品分析的那些事儿。 一、明确 ...
2025-01-03在数据分析的江湖里,有两个阵营总是争论不休。一派信奉“大即是美”,认为数据越多越好;另一派坚守“小而精”,力挺质量胜于规 ...
2025-01-02数据分析是一个复杂且多维度的过程,从数据收集到分析结果应用,每一步都是对信息的提炼与升华。可视化分析结果,以图表的形式展 ...
2025-01-02在当今的数字化时代,数据分析师扮演着一个至关重要的角色。他们如同现代企业的“解密专家”,通过解析数据为企业提供决策支持。 ...
2025-01-02数据分析报告至关重要 一份高质量的数据分析报告不仅能够揭示数据背后的真相,还能为企业决策者提供有价值的洞察和建议。 年薪 ...
2024-12-31数据分析,听起来好像是技术大咖的专属技能,但其实是一项人人都能学会的职场硬核能力!今天,我们来聊聊数据分析的核心流程,拆 ...
2024-12-31