#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ SQLite 数据库操作模块 支持基本的增删改查操作 """ import sqlite3 class SQLiteDatabase: """SQLite 数据库连接和操作类""" def __init__(self, database='database.db'): """ 初始化 SQLite 连接参数 :param database: 数据库文件路径 """ self.database = database self.connection = None def connect(self): """建立数据库连接""" try: self.connection = sqlite3.connect(self.database) # 设置行工厂,使查询结果以字典形式返回 self.connection.row_factory = sqlite3.Row return True, f"SQLite 连接成功 (数据库: {self.database})" except Exception as e: return False, f"SQLite 连接失败: {str(e)}" def execute(self, sql, params=None): """ 执行 SQL 语句或 SQLite 点命令 :param sql: SQL 语句或点命令(如 .tables, .schema) :param params: 参数(可选) :return: 执行结果 """ if not self.connection: return False, "未连接到数据库" # 处理 SQLite 点命令 cmd = sql.strip() if cmd.startswith('.'): try: # .tables - 列出所有表 if cmd in ['.tables', '.table']: cursor = self.connection.cursor() cursor.execute("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name") tables = [row[0] for row in cursor.fetchall()] return True, tables # .schema - 显示所有表的结构 elif cmd == '.schema': cursor = self.connection.cursor() cursor.execute("SELECT sql FROM sqlite_master WHERE type='table' AND sql IS NOT NULL ORDER BY name") schemas = [row[0] for row in cursor.fetchall()] return True, schemas # .schema - 显示特定表的结构 elif cmd.startswith('.schema '): table_name = cmd.split(maxsplit=1)[1] cursor = self.connection.cursor() cursor.execute("SELECT sql FROM sqlite_master WHERE type='table' AND name=?", (table_name,)) result = cursor.fetchone() if result: return True, result[0] else: return False, f"表 '{table_name}' 不存在" # .databases - 列出数据库信息 elif cmd in ['.databases', '.database']: return True, [f"main: {self.database}"] # .indexes - 列出所有索引 elif cmd in ['.indexes', '.index']: cursor = self.connection.cursor() cursor.execute("SELECT name FROM sqlite_master WHERE type='index' ORDER BY name") indexes = [row[0] for row in cursor.fetchall()] return True, indexes # .indexes
- 列出特定表的索引 elif cmd.startswith('.indexes ') or cmd.startswith('.index '): table_name = cmd.split(maxsplit=1)[1] cursor = self.connection.cursor() cursor.execute("SELECT name FROM sqlite_master WHERE type='index' AND tbl_name=? ORDER BY name", (table_name,)) indexes = [row[0] for row in cursor.fetchall()] return True, indexes else: return False, f"不支持的点命令: {cmd.split()[0]}" except Exception as e: return False, f"执行失败: {str(e)}" # 执行标准 SQL 语句 try: cursor = self.connection.cursor() cursor.execute(sql, params or ()) # 判断是查询还是修改操作 if sql.strip().upper().startswith(('SELECT', 'PRAGMA')): rows = cursor.fetchall() # 转换为字典列表 result = [dict(row) for row in rows] return True, result else: self.connection.commit() return True, f"影响行数: {cursor.rowcount}" except Exception as e: self.connection.rollback() return False, f"执行失败: {str(e)}" def close(self): """关闭数据库连接""" if self.connection: self.connection.close() self.connection = None return "SQLite 连接已关闭" return "连接已经关闭"