sqlite3是一个文件型数据库,使用起来非常的便捷。
但是因为我sql语句不熟悉,所以我进行了二次封装。

导入

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
# 文件 : SQLite3封装.py
# 时间 : 2023/09/20 23:33:47
# 作者 : ziyii
# 版本 : 1.0
# 邮箱 : temp@ziyii.top
# 协议 : <GNU General Public License v3.0>
# 简介 : SQLite3库的简单封装。
'''

# 以下是导入库

import sqlite3, loguru

sqlite3是py自带的库。
loguru好像是第三方库,是一个简便实用的日志库。

基础框架

def 基础框架(文件路径: str, sql语句: str) -> list | None:
    """基础框架,用于执行SQl语句,如果你想直接使用SQL语句可以直接调用这个函数。\n
    读取数据库报错返回 None

    参数:
        文件路径(str):数据库文件路径,默认是项目的起始目录,使用相对路径时请注意。\n\n
        sql语句(str):需要执行的sql语句。\n

    返回值:
        list:返回的是数据库读取的列表,有数据的列表里是数据元组,没有数据的是空列表`[]`。\n
        none:报错返回的内容。
    """
    数据库 = sqlite3.connect(文件路径)
    数据库_游标 = 数据库.cursor()
    try:
        数据库_游标.execute(sql语句)
        返回值 = 数据库_游标.fetchall()
    except Exception as e:
        loguru.logger.error(f"数据库错误: {e}")
        数据库.rollback()
        return None
    数据库.commit()
    数据库.close()
    return 返回值

创建表

def 创建表(文件路径: str, 表名: str, 主键: str, 键: list | None = None) -> list | None:
    """

    参数:
        文件路径(str):数据库文件路径,默认是项目的起始目录,使用相对路径时请注意。\n
        表名(str):数据库文件中的数据表的名字。\n
        主键(str):数据库中的主键,主键属性(唯一,非空)。\n
        键(list):其他的键,如果只有一个键也需要传入列表形式。

    返回值:
        list:返回的是空列表 `[]`\n
        none:报错返回的内容。
    """
    键_i = ''
    if 键 is not None:
        for i in 键:
            键_i += f',`{i}`'
    sql语句 = rf'''CREATE TABLE `{表名}` (`{主键}` PRIMARY KEY UNIQUE NOT NULL {键_i});'''
    return 基础框架(文件路径, sql语句)

限制

def 限制(条件一: str, 条件二: str, 条件: str = '等于') -> str | None:
    """

    参数:
        条件一(str):前一个条件。\n
        条件二(str):后一个条件。\n
        条件(str):需要做的判断。\n
            判断条件支持:'等于','大于','大于等于','小于','小于等于','不等于','开头包含','开头不包含','在','不在']

    返回值:
        str:返回的是限制的SQl语句,无WHERE,只是WHERE后的限制语句。\n
        none:报错返回的内容。
    """
    条件对应字典: dict = {
        '等于': '=',
        '大于': '>',
        '大于等于': '>=',
        '小于': '<',
        '小于等于': '<=',
        '不等于': 'IS NOT',
        '开头包含': 'LIKE',
        '开头不包含': 'NOT LIKE',
        '在': 'IN',
        '不在': 'NOT IN'
    }
    if 条件 not in 条件对应字典.keys():
        loguru.logger.error(f"条件错误: {条件}")
        return
    else:
        return rf'"{条件一}"{条件对应字典[条件]}"{条件二}"'

读取

def 读取(文件路径: str,
       表名: str,
       键: list,
       限制: str | None = None,
       默认值=None) -> list | None:
    """
    参数:
        文件路径(str):数据库文件路径,默认是项目的起始目录,使用相对路径时请注意。\n
        表名(str):数据库文件中的数据表的名字。\n
        键(list):需要读取的键,如果只有一个键也需要传入列表形式。\n
        限制(str):对取值范围进行限制,WHERE自动添加了,无需再添加一遍。\n
        默认值:如果读取内容为空的时候返回的结果。

    返回值:
        list:返回的是数据库读取的列表,有数据的列表里是数据元组,没有数据的是空列表`[]`。\n
        none:报错返回的内容。
    """
    键_i = ''
    限制_i = ''
    for i in 键:
        键_i += f'{i}, '
    if 限制 != None:
        限制_i += f'WHERE {限制}'
    sql语句 = rf'''SELECT {键_i[:-2]} FROM {表名} {限制_i};'''
    基础框架_返回数据 = 基础框架(文件路径, sql语句)
    if 基础框架_返回数据 == None:
        return 默认值
    return 基础框架_返回数据

写入

def 写入(文件路径: str, 表名: str, 键: list, 值: list) -> list | None:
    """
    参数:
        文件路径(str):数据库文件路径,默认是项目的起始目录,使用相对路径时请注意。\n
        表名(str):数据库文件中的数据表的名字。\n
        键(list):需要写入的键,如果只有一个键也需要传入列表形式。\n
            与值的列表顺序是对应关系。\n
        值(list):需要写入的键,如果只有一个键也需要传入列表形式。\n
            与键的列表顺序是对应关系。

    返回值:
        list:返回的是空列表 `[]`\n
        none:报错返回的内容。
    """
    键_i = ''
    值_i = ''
    键值对_i = ''
    if 读取(文件路径, 表名, 键, 限制(键[0], 值[0], '等于')) != []:
        for i in range(len(键)):
            键值对_i += f'{键[i]} = "{值[i]}", '
        sql语句 = rf'''UPDATE {表名} SET {键值对_i[:-2]} WHERE {限制(键[0], 值[0], '等于')};'''
    else:
        for i in 键:
            键_i += f'{i}, '
        for i in 值:
            值_i += f'"{i}", '
        sql语句 = rf'''INSERT INTO {表名} ({键_i[:-2]}) VALUES ({值_i[:-2]});'''
    return 基础框架(文件路径, sql语句)

示例

import SQLite3封装

SQLite3封装.创建表('./db.db', 表名='ziyii', 主键='QQ号', 键=['测试1', '测试2'])
SQLite3封装.写入('./db.db', 表名='ziyii', 键=['QQ号', '测试1'], 值=['1234', 1569])
SQLite3封装.读取('./db.db', 表名='ziyii', 键=['QQ号', '测试1'], 限制=限制('QQ号', '1234', '等于'))