序
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', '等于'))