首页 > 数据库 >python SQLite 访问组件

python SQLite 访问组件

时间:2024-08-06 15:27:44浏览次数:5  
标签:SQLite python self db cursor sql 组件 table conn

import os
import sqlite3
from sqlite3 import Error
from queue import Queue, Empty
from typing import List,Tuple, Any


class SQLiteDB:

    default_db_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    default_db_file = default_db_path+"/db/mydb.db"

    def __init__(self, db_file=None, max_connections=10):
        self.db_file = db_file or self.default_db_file
        self.max_connections = max_connections  # 连接池最大连接数
        self.pool = Queue(maxsize=max_connections)  # 连接池

        for _ in range(max_connections):
            self.pool.put(sqlite3.connect(db_file))

    # 获得数据库连接
    def _get_connection(self):
        try:
            return self.pool.get(timeout=5)
        except Empty:
            raise Exception("No available database connections")

    # 释放数据库连接
    def _release_connection(self, conn):
        self.pool.put(conn)

    # 执行SQL语句
    def _execute_sql(self, sql: str, params: Tuple[Any, ...] = ()):
        conn = self._get_connection()
        cursor = conn.cursor()
        try:
            cursor.execute(sql, params)
            conn.commit()
        finally:
            cursor.close()
            self._release_connection(conn)

    # 创建表格
    def create_table(self, create_table_sql):
        self._execute_sql(create_table_sql)

    # 删除表格
    def drop_table(self, table_name):
        sql = f'DROP TABLE IF EXISTS {table_name}'
        self._execute_sql(sql)

    # 插入数据
    def insert(self, table, data):
        columns = ', '.join(data.keys())
        placeholders = ', '.join('?' * len(data))
        sql = f'INSERT INTO {table} ({columns}) VALUES ({placeholders})'
        self._execute_sql(sql, tuple(data.values()))

    # 更新数据
    def update(self, table, data,  condition="1=1"):
        placeholders = ', '.join([f"{column} = ?" for column in data.keys()])
        sql = f'UPDATE {table} SET {placeholders} WHERE {condition}'
        self._execute_sql(sql, tuple(data.values()))

    # 删除数据
    def delete(self, table, condition="1=1"):
        sql = f'DELETE FROM {table} WHERE {condition}'
        self._execute_sql(sql)

    # 查询多条数据
    def find_all(self, table, condition="1=1"):
        sql = f'SELECT * FROM  {table} WHERE {condition}'
        conn = self._get_connection()
        cursor = conn.cursor()
        try:
            cursor.execute(sql)
            return cursor.fetchall()
        finally:
            cursor.close()
            self._release_connection(conn)

    # 分页查询
    def find_page(self, table, page=1, page_size=10, condition="1=1"):
        offset = (page - 1) * page_size
        sql = f'SELECT * FROM  {table} WHERE {condition} LIMIT {page_size} OFFSET {offset}'
        conn = self._get_connection()
        cursor = conn.cursor()
        try:
            cursor.execute(sql)
            return cursor.fetchall()
        finally:
            cursor.close()
            self._release_connection(conn)

    # 查询单条数据
    def find_one(self, table, condition="1=1"):
        sql = f'SELECT * FROM  {table} WHERE {condition}'
        conn = self._get_connection()
        cursor = conn.cursor()
        try:
            cursor.execute(sql)
            return cursor.fetchone()
        finally:
            cursor.close()
            self._release_connection(conn)

    # 查询多条数据(自定义sql)
    def query_all(self, sql: str, params: Tuple[Any, ...] = ()) -> List[Tuple]:
        conn = self._get_connection()
        cursor = conn.cursor()
        try:
            cursor.execute(sql, params)
            return cursor.fetchall()
        finally:
            cursor.close()
            self._release_connection(conn)

    # 查询单条数据(自定义sql)
    def query_one(self, sql: str, params: Tuple[Any, ...] = ()) -> Tuple:
        conn = self._get_connection()
        cursor = conn.cursor()
        try:
            cursor.execute(sql, params)
            return cursor.fetchone()
        finally:
            cursor.close()
            self._release_connection(conn)


# 数据库定义,供各个应用程序使用
mydb = SQLiteDB('mydb.db')


# 使用示例
if __name__ == '__main__':

    db = SQLiteDB('example.db')

    # 创建表格
    create_table_sql = """ CREATE TABLE IF NOT EXISTS users (
                                            id integer PRIMARY KEY AUTOINCREMENT,
                                            name text NOT NULL,
                                            age integer,
                                            salary REAL,
                                            is_active BOOLEAN
                                        ); """
    db.create_table(create_table_sql)

    # 插入数据
    db.insert('users', {'name': 'Alice', 'age': 30, 'salary': 5000.88, 'is_active': False})
    db.insert('users', {'name': 'Tom', 'age': 40, 'salary': 6000.66, 'is_active': True})
    db.insert('users', {'name': 'Lily', 'age': 28, 'salary': 7000.77, 'is_active': True})
    db.insert('users', {'name': 'Bate', 'age': 25, 'salary': 9000.99, 'is_active': True})
    db.insert('users', {'name': 'Lucy', 'age': 28, 'salary': 3000.33, 'is_active': True})

    # 更新数据
    condition = "name='{}'".format("Alice") # 查询条件 name='Alice'
    db.update('users', {'age': 33, 'salary': 8000.88}, condition)

    # 查询数据
    condition = "name='{}'".format("Tom") # 查询条件 name='Tom'
    print(db.find_one("users", condition))
    print(db.find_all("users"))
    print(db.find_page("users",2,3))

    # 删除数据
    condition = "name='{}'".format("Alice") # 查询条件 name='Alice'
    db.delete('users', condition)
    # db_tools.delete('users')  # 删除所有数据

    print("删除数据后——————————————————")
    print(db.find_one("users"))
    print(db.find_all("users"))

    print("自定义Sql 查询——————————————————")

    sql = "SELECT * FROM users where name=? "
    print(db.query_one(sql, ("Tom",)))

    sql = "SELECT * FROM users where salary > ? and is_active = ?"
    print(db.query_all(sql, (7000, True)))

    # 删除表格
    db.drop_table('users')

 

标签:SQLite,python,self,db,cursor,sql,组件,table,conn
From: https://www.cnblogs.com/rulian/p/18345253

相关文章

  • Python 卡在第 1 页
    让它读取下一页结果的最佳方法是什么?目前正在拉取数据,但只有第1页importrequestsimportjsonpage=1url="https://api-prod.grip.events/1/container/4368/search?search=&sort=name&order=asc&type_id=4907,4906,5265,4964,4904,1026,4908&page=%d"headers={......
  • 无法反序列化解码 JWT python 时的关键数据
    我正在使用pyjwt库来解码JWT令牌。我在解码时遇到此错误。代码在文档中给出。importjwtencoded_jwt='''eyJ0eXAiOiJKV1QiLCJhbG......'''secret=b''''-----BEGINPUBLICKEY-----MIIFRjCCBC6gAwIBAgIQCIdSGhpikQCjOIY154XoqzANBgkqhkiG9......
  • Python科研武器库 - 字符串操作 - 字符串开头结尾判断 startswith() endswith()
    使用场景:按照开头的前缀、结尾的后缀来判断、筛选目标字符串。使用函数:str.startswith(search_string,start,end)str.endswith(search_string,start,end)search_string:要匹配的目标字符串。start:要从中匹配search_string的str的起始索引。end:要考虑匹配的str的结......
  • 我正在 python 中使用 aspose.pdf 将 pdf 转换为 excel 。但问题是它只能将 pdf 的前
    `从tkinter导入*将aspose.pdf导入为ap从tkinter导入文件对话框importpandasaspdinput_pdf=filedialog.askopenfilename(filetypes=(("PDF文件",".pdf"),("所有文件",".")))output_file=filedialog.asksaveasfil......
  • WHAT - Table 表格组件系列(一)
    目录前言antdvsantdProComponents体验区别antdTableantdProTable前言Table可以说是很多业务系统最重要的一个开发场景。在很多组件库,对于Table组件的封装高度完善。今天我们将开始通过antd的Table组件和antdProComponents的ProTable组件来进行学......
  • 如何在selenium python中访问电子邮件中的所有文件夹
    我使用imaplib库,但有时无法访问某些帐户,我使用poplib但它只支持访问主邮箱,但不支持访问其他文件夹,如垃圾邮件我想使用imaplib,但不会出现有时甚至无法访问的错误尽管我有一个帐户,但我仍然可以访问它,或者是否有另一个库可以快速支持该帐户?你想要使用Selenium和Python......
  • python安装torch-cluster、torch-scatter、torch-sparse和torch-geometric | torch_ge
    1.检查CUDA版本【方法1】用nvidia-smi已装cuda,用nvidia-smi或nvcc-V查看【方法2】用torch已装torch,用torch代码打印importtorchprint(torch.__version__)#查看pytorch安装的版本号print(torch.cuda.is_available())#查看cuda是否可......
  • 【微信小程序实战教程】之微信小程序核心组件详解
    微信小程序核心组件组件化开发并不是小程序所特有的,一些其他编程语言中都有组件化的概念,准确来讲,只有UI视图层的展示,就必定要用到组件化。组件是UI视图层的最基本组成单元,组件中包含了一些基础功能和基础样式,一个组件就类似于一个自定义的标签。小程序框架为开发者提供了......
  • Python:学生成绩管理系统(大学编程期末实验)
    引言在这个信息时代,教育管理的自动化已成为提高效率的关键。本文将介绍如何使用Python开发一个学生成绩管理系统,旨在简化成绩记录、查询和分析的过程。创作灵感来源本项目灵感来源于我在教育机构的工作经历,以及对提高教育管理效率的持续追求。通过复盘过往项目,我意识到一个......
  • 手把手教你使用Python网络爬虫下载一本小说(附源码)
    大家好,我是Python进阶者。前言前几天【磐奚鸟】大佬在群里分享了一个抓取小说的代码,感觉还是蛮不错的,这里分享给大家学习。一、小说下载如果你想下载该网站上的任意一本小说的话,直接点击链接进去,如下图所示。只要将URL中的这个数字拿到就可以了,比方说这里是951,那么这个数字......