关于sqlite

虽然做python也有好多年了,但是python的入门是从深度学习的需要而开始的,所以对于python常见的一些应用反而不熟甚至没用过,比如爬虫,比如数据库,甚至pandas都不熟,如果能with open再按行读取的话,必然是我的唯一选择,除非字段中出现了换行。。。

这次的问题是,想要保存下ai的QA问答,之前直接上传到网络数据库,是的,我是用的阿里的sdk完成增删改查的,直到同事发现,原来人家直接支持sql语句,那我不懂,也不想懂。但后来觉得这么点东西,而且是公司内部的一个ai使用,没啥保存在云端的必要,还费钱,就琢磨着保存在本地。

写了这么一个类。

python 复制代码
import sqlite3 as sl 

# import  time
# def timer(func):
#     def func_in(*args, **kwargs):
#         start_time = time.time()
#         res = func(*args, **kwargs)
#         end_time = time.time()
#         result = end_time - start_time
#         print(f'{func.__name__} cost time is %.3fs' % result)
#         return res
#     return  func_in

class localSQL:
    def __init__(self, dbName='QA.db', tableName='qa', title='(chat_id, user_id, user_name, Q, A, created_time)'):
        self.dbName = dbName
        self.con = sl.connect(dbName)
        self.tableName = 'danmu'
        self.title = title

    def creatTable(self, content='(chat_id TEXT,user_id TEXT,user_name TEXT, Q TEXT, A TEXT, created_time TEXT)'):
        tableContent = content
        with self.con: 
            self.con.execute(f"CREATE TABLE {self.tableName} {tableContent};")
    
    # @timer
    def insertDB(self, content:tuple):
        sql = f"INSERT INTO {self.tableName} {self.title} values{str(content)}"
        self.con.execute(sql)
        self.con.commit()
        return 0

    def insertListDB(self, content:list):
        sql = f"INSERT INTO {self.tableName} {self.title} values({(('?,')*len(self.title.split(',')))[:-1]})"
        self.con.executemany(sql, content)
        self.con.commit()

        return 0

    def updateDB(self, title:str, content:str, condition:str):
        sql = f"UPDATE {self.tableName} SET {title}=\"{content}\" WHERE {condition}"
        self.con.execute(sql)
        self.con.commit()

        return 0

    def selectDB(self, condition):

        with self.con:
            data = self.con.execute(f"SELECT * FROM {self.tableName} WHERE {condition}") 
        return tuple(data)

if __name__ == "__main__":
    
    ss = localSQL()
    ss.creatTable()
    # data = ss.selectDB('Q=0')
    # data = sorted(data, key=lambda x:x[1])
    # for _ in data:
    #     print(_)

    # # ss.insertListDB([
    # #         ('1', '2', '3', '4', '5', '6'), 
    # #         ('1', '2', '3', '4', '5', '6'), 
    # #         ('1', '2', '3', '4', '5', '6')
    # #    ])
    
    # ss.insertDB(("20251110_174128_5e9b1f32eee445118e54" ,"4165382228676092", "lake",  "nihao a " , "", "2025"))
    # ss.updateDB('A', '123', 'chat_id=\"20251110_174128_5e9b1f32eee445118e54\"')


    

临时去掉了一些数据代码,导致可能有bug哈,懒得查了。

这个库最开始应用在代码中,发现执行到的时候,就没有然后了,程序也没有死,但是也没有执行,经过各种排查,都没有查到到底是怎么了。

最后发现是传进来的参数,时间那里,我是直接传了一个datetime的函数,结果写错了,没挂的原因可能是由于在线程中,其中没有打印也可能是因为此。最后的排查,发现有两点想要记录:

一、线程中的错误或者别的什么原因不会输出在终端,此时可以通过try,通过traceback.print_exc()来输出错误,什么原理没有深究,不过这个一查就能查到,后续有这种难解的问题,可以试试。

二、这个库,创建对象和进行操作的时候,需要在同一个线程中,也就是有同一个线程id,比如我在主线程创建,然后调用的时候,会报错,错误提示很清晰,就不赘述了,所以最后改成,需要插入或者更新的时候,立即创建一个对象,完了后销毁就行了,不过这样不知道有没有别的问题。

以上两点,对于老手来说,或者会觉得有失偏颇,或者太菜了,这个,我也觉得,思考深度不够,不过作为一个记录贴,这样也差不多了。

相关推荐
远方160916 分钟前
108-ORA-00600 [kdsgrp1-qetlbr] 内部错误排查与 RMAN 块级恢复
大数据·linux·数据库·oracle
福娃筱欢41 分钟前
SQLServer迁移至KES SQLServer模式 问题整理
数据库·oracle·sqlserver
hflmwl81 小时前
RedisDesktopManager安装包中文版官方下载,redis可视化客户端工具下载
数据库·redis·缓存·可视化客户端工具
FluxDB1 小时前
《用 Rust + GPUI 做了一个开源数据库客户端:FluxDB》
数据库
roman_日积跬步-终至千里1 小时前
【数据Agent论文·查询与语义|09】Spider 2.0:从生成SQL走向完成企业工作流
数据库·sql·数据分析
曦夜日长1 小时前
MySQL系统篇,数据库基础(二):数据库概念、SQL 分类与存储引擎
数据库·sql·mysql
泡海椒1 小时前
JQuick-SQL AST 解析:从 SQL 文本到强类型节点
数据库·sql
要开心吖ZSH1 小时前
SeaTunnel + Doris + MySQL-CDC 数据同步故障排查个人笔记
数据库·mysql·doris·seatunnel·mysql cdc
data analyse 4561 小时前
Session数怎么计算?明确会话切分、超时与跨页规则
java·服务器·数据库
骑着蜗牛撵大象3272 小时前
ToolJet + PostgreSQL:后台表格、查询和流程,一次搭成可远程访问的业务系统
数据库·低代码·docker·postgresql·内部工具·tooljet