【Python】sqlite模块_连接sqlite数据库
内置库sqlite
# 引用 import sqlite
创建/打开数据库
conn = sqlite3.connect(dbName + ".db", check_same_thread=False) # 尝试打开数据库文件,不存在则创建数据库
Tips:check_same_thread这个设置为False,即可允许sqlite被多个线程同时访问
使用游标
# 使用游标 cu = conn.cursor()
执行语句
# 查询表中是否存在字段 Name cu.execute("select Value from " + table + " where Name = '" + Name + "';")
获取结果
# 获取单条结果 result_single = cu.fetchone() # 获取指定数量结果 result_many = cu.fetchmany() # 获取全部结果 result_all = cu.fetchall()
游标回滚
# 游标滚动 cu.scroll()
新增及修改需要提交语句
# 提交 conn.commit()
关闭数据库
# 关闭数据库 conn.close()
python 对sqlite的增删改查
class sqlite_tools: """通用sqlite方法""" def __init__(self, env, cmd, dbname="db", tableName="db"): """ 构造函数 :param env: 测试环境 sit/uat :param dbname: db数据库名 :param tableName: 表名 """ self.env = env.upper() self.cmd = str(cmd) if self.env == 'SIT': self.dbname = dbname.upper() + "_SIT" elif self.env == 'UAT': self.dbname = dbname.upper() + "_UAT" else: self.dbname = dbname.upper() self.tableName = tableName.upper() # 创建/打开数据库 try: if 'base' in os.listdir(os.getcwd()): self.conn = sqlite3.connect(os.getcwd() + "\\base\\" + self.dbname + ".db") # 尝试打开数据库文件 check_same_thread=False elif 'base' in os.listdir(os.path.dirname(os.getcwd())): self.conn = sqlite3.connect(os.path.dirname(os.getcwd()) + "\\base\\" + self.dbname + ".db") # 尝试打开数据库文件 except Exception as e: E = '打开数据库文件失败 ' + str(e) logs.error("exception ", E) # 返回错误代码1和失败原因 else: logs.info(" sqlite_msg >> 打开数据库 ") # 使用游标 self.cu = self.conn.cursor() self.tableName_exits() def __del__(self): """对象资源被释放时触发,在对象即将被删除时的最后操作""" # 关闭游标 self.cu.close() # 关闭数据库连接 self.conn.close() logs.info(" sqlite_msg >> 关闭数据库 ") def tableName_exits(self): """查看表名是否存在""" # 查询数据库中是否存在表名 table self.cu.execute("select name from sqlite_master where type='table' and name = '" + self.tableName + "';") table = self.cu.fetchall() # 判断数据库中是否存在表 table,不存在则创建存在提示则不创建 if len(table) == 0: # 创建表 self.cu.execute(f"CREATE TABLE {self.tableName}(name VARCHAR NOT NULL, value VARCHAR NOT NULL, create_time VARCHAR(30), update_time VARCHAR(30), num varchar, remark1 VARCHAR, remark2 VARCHAR, remark3 VARCHAR);") self.cu.fetchall() self.conn.commit() # logs.debug(" sqlite_msg >> " + self.tableName + " 表 创建成功,添加数据") elif len(table) == 1: # logs.debug(" sqlite_msg >> " + self.tableName + " 表已存在,更新数据 ") pass else: logs.error(" sqlite_msg >> 其他错误: " + table) sys.exit() def select_db(self, sql): """ 查询 """ # 使用 execute() 执行sql self.cu.execute(sql) # 使用 fetchall() 获取查询结果 data = self.cu.fetchall() return data def execute_db(self, sql): """ 更新/插入/删除 """ try: # 使用 execute() 执行sql self.cu.execute(sql) # 提交事务 self.conn.commit() except Exception as e: print(f"操作出现错误:{e}") # 回滚所有更改 self.conn.rollback() if __name__ == "__main__": env = "sit"
示例

# coding:utf-8 import sqlite3 import os import sys import datetime from loguru import logger as logs class sqlite_tools: """通用sqlite方法""" def __init__(self, env, cmd, dbname="db", tableName="db"): """ 构造函数 :param env: 测试环境 sit/uat :param dbname: db数据库名 :param tableName: 表名 """ self.env = env.upper() self.cmd = str(cmd) if self.env == 'SIT': self.dbname = dbname.upper() + "_SIT" elif self.env == 'UAT': self.dbname = dbname.upper() + "_UAT" else: self.dbname = dbname.upper() self.tableName = tableName.upper() # 创建/打开数据库 try: if 'base' in os.listdir(os.getcwd()): self.conn = sqlite3.connect(os.getcwd() + "\\base\\" + self.dbname + ".db") # 尝试打开数据库文件 check_same_thread=False elif 'base' in os.listdir(os.path.dirname(os.getcwd())): self.conn = sqlite3.connect(os.path.dirname(os.getcwd()) + "\\base\\" + self.dbname + ".db") # 尝试打开数据库文件 except Exception as e: E = '打开数据库文件失败 ' + str(e) logs.error("exception ", E) # 返回错误代码1和失败原因 else: logs.info(" sqlite_msg >> 打开数据库 ") # 使用游标 self.cu = self.conn.cursor() self.tableName_exits() def __del__(self): """对象资源被释放时触发,在对象即将被删除时的最后操作""" # 关闭游标 self.cu.close() # 关闭数据库连接 self.conn.close() logs.info(" sqlite_msg >> 关闭数据库 ") def tableName_exits(self): """查询表名是否存在""" # 查询数据库中是否存在表名 table self.cu.execute("select name from sqlite_master where type='table' and name = '" + self.tableName + "';") table = self.cu.fetchall() # 判断数据库中是否存在表 table,不存在则创建存在提示则不创建 if len(table) == 0: # 创建表 self.cu.execute(f"CREATE TABLE {self.tableName}(name VARCHAR NOT NULL, value VARCHAR NOT NULL, create_time VARCHAR(30), update_time VARCHAR(30), num varchar, remark1 VARCHAR, remark2 VARCHAR, remark3 VARCHAR);") self.cu.fetchall() self.conn.commit() # logs.debug(" sqlite_msg >> " + self.tableName + " 表 创建成功,添加数据") elif len(table) == 1: # logs.debug(" sqlite_msg >> " + self.tableName + " 表已存在,更新数据 ") pass else: logs.error(" sqlite_msg >> 其他错误: " + table) sys.exit() def save_data(self, colName, colValue, num='', remark1='', remark2='', remark3=''): """ 保存数据 :param colName: 字段名 :param colValue: 字段值 :param num:编号 :param remark1: 备注1 :param remark2: 备注2 :param remark3: 备注3 :return: """ if num == '': name = f"{self.cmd}_{colName}" else: name = f"{num}_{self.cmd}_{colName}" createTime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 查询表中是否存在字段 Name self.cu.execute("select Value from " + self.tableName + " where Name = '" + name + "';") sqlValue = self.cu.fetchall() # 判断表中存在字段则更新,不存在则插入 if len(sqlValue) == 0: insql = f"INSERT INTO {self.tableName} (Name,Value,create_Time,update_Time,num, remark1,remark2,remark3) VALUES ('{name}', '{colValue}','{createTime}', '', '{num}', '{remark1}', '{remark2}', '{remark3}'); " self.cu.execute(insql) self.cu.fetchall() self.conn.commit() # logs.info(" sqlite_msg >> " + self.tableName + " 字段添加成功 : " + name + " = " + colValue) elif len(sqlValue) == 1: upsql = f"update {self.tableName} set Value = '{colValue}',update_Time = '{createTime}' where Name = '{name}' and remark1 like '{remark1}' and remark2 like '{remark2}' and remark3 like '{remark3}';" self.cu.execute(upsql) self.cu.fetchall() self.conn.commit() # logs.info(" sqlite_msg >> " + self.tableName + " 字段更新成功 : " + name + " = " + colValue) else: logs.error(" sqlite_msg >> 其他错误:") sys.exit() def query_data(self, colName, num='', remark1='', remark2='', remark3=''): """ 查询数据 :param colName:字段名 :param num:编号 :param remark1: 备注1 :param remark2: 备注2 :param remark3: 备注3 :return:查询结果 """ if num == '': query_name = f"{self.cmd}_{colName}" else: query_name = f"{num}_{self.cmd}_{colName}" # 查询表中是否存在字段 Name querysql = f"select Value from {self.tableName} where Name = '{query_name}' and num like '{num}' and remark1 like '{remark1}'and remark2 like '{remark2}'and remark3 like '{remark3}';" self.cu.execute(querysql) sql_value = self.cu.fetchall() # 判断表中存在字段则取值,不存在则结束 if len(sql_value) == 0: return '' elif len(sql_value) == 1: # logs.info(' sqlite_msg >> 查询 ' + self.tableName + ' 数据 ' + Name + ': ' + sql_value[0][0]) return sql_value[0][0] else: logs.error(" sqlite_msg >> 其他错误:") return '' if __name__ == "__main__": env = "sit" sqlite_tools(env, "1000").save_data("name", "zhangsan") sqlite_tools(env, "1000").save_data("name", "zhangsan1", "202211091338") sqlite_tools(env, "1000").query_data("name") re = sqlite_tools(env, "1000").query_data("name", "202211091338") logs.debug(re)
执行结果
生成数据库
执行结果
表数据
-------------------------------------------------------------------------------------
如果万事开头难 那请结局一定圆满 @ Phoenixy
-------------------------------------------------------------------------------------
分类:
Python
标签:
python 模块及工具
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具