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

image

1. 前言

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

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

事实上,Python 内置了 sqlite3 模块,不须要安装任何依赖,就能够直接操做 Sqlite 数据库session

2. 准备

和 Python 操做 Mysql 相似,操做 Sqlite 主要包含下面 2 种方式:函数

  • sqlite3 + 原生 SQL测试

  • SQLAlchemy + ORMfetch

3. sqlite3 + 原生 SQL

因为 Python 内置了 sqlite3 模块,这里直接导入就可使用了3d

# 导入内置模块sqlite3
import sqlite3

首先,咱们使用 sqlite3 的 connnect() 方法建立一个数据库链接对象,若是数据库不存在,就自动在对应目录下新建一个数据库文件code

# 建立数据库链接对象,若是数据库不存在,就自动新建一个数据库文件
# 还能够指定其余参数,包含:超时时间
 self.conn = sqlite3.connect(self.path_db)

而后,经过数据库链接对象获取一个操做数据库的 游标实例orm

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

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

# 建立表
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)

接下来,咱们经过增删改查来操做数据表

一、新增

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

对于单条数据的插入,只须要编写一条插入的 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 步,分别是:

  • 经过游标对象执行查询的 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)

三、更新

和 新增操做 相似,更新操做也是经过数据库链接对象去执行更新的 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()

四、删除

删除操做同查询、新增操做相似,只须要执行删除的 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)()

这样全部的准备工做已经完成,接下来能够进行增删改查操做了

一、新增

新增操做一样以新增一条和多条记录为例,它们分别对应会话对象的 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()

二、查询

查询数据表的操做对应会话对象的 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))

三、更新

更新操做通常作法是:

  • 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()

四、删除

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

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

以按照 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?

相关文章
相关标签/搜索