【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)
实例
复制代码

 

 

执行结果

生成数据库

 

执行结果

 

表数据

 

posted @   Phoenixy  阅读(309)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示