Python 实战:构建 SQLite 图形化查询助手
引言
SQLite 是轻量级数据库的代表,被广泛用于本地存储、移动应用、嵌入式设备等场景。尽管 SQLite 本身附带命令行工具,但对于不擅长写 SQL 的用户、测试人员或数据分析师来说,一个图形化的数据库查询助手 更具实用性。
本文将带你使用 Python 构建一个支持 拖拽数据库文件、自动读取表结构、快速执行 SQL 查询并展示结果 的桌面图形工具。
一、项目功能概览
1.1 功能亮点
拖拽
.db
或.sqlite
文件自动打开自动识别所有数据表
表结构可视化展示
支持用户输入 SQL 语句并执行
查询结果展示为表格,可复制导出
纯本地运行,适合数据开发者、测试人员使用
1.2 应用场景
快速查看 SQLite 本地数据库内容
无需命令行也能写 SQL 查询
作为轻量级测试、分析工具使用
内部运维人员用于快速诊断数据表
二、技术栈说明
技术 | 用途 |
---|---|
Tkinter | 构建 GUI 图形界面 |
sqlite3 | 执行 SQLite 查询操作 |
ttk.Treeview | 表格展示 SQL 查询结果 |
filedialog | 文件选择或拖拽打开 |
ScrolledText | SQL 编辑与日志输出窗口 |
三、项目结构设计
bash
复制编辑
sqlite_gui_assistant/
├── main.py # 主程序入口 ├── db_browser.py # 数据库连接与表结构分析 ├── ui.py # 图形界面组件 └── query_executor.py # 查询执行与结果渲染
四、数据库浏览模块 db_browser.py
python
复制编辑
import sqlite3 class SQLiteBrowser: def __init__(self, db_path):
self.conn = sqlite3.connect(db_path) def list_tables(self):
cursor = self.conn.execute("SELECT name FROM sqlite_master WHERE type='table';") return [row[0] for row in cursor.fetchall()] def describe_table(self, table_name):
cursor = self.conn.execute(f"PRAGMA table_info({table_name})") return [(row[1], row[2]) for row in cursor.fetchall()] # [(字段名, 类型)] def execute(self, sql):
cursor = self.conn.cursor()
cursor.execute(sql) try:
rows = cursor.fetchall()
columns = [desc[0] for desc in cursor.description] return columns, rows except: return [], [] def close(self):
self.conn.close()
五、SQL 执行模块 query_executor.py
python
复制编辑
from db_browser import SQLiteBrowser class QueryExecutor: def __init__(self):
self.browser = None def load_db(self, path):
self.browser = SQLiteBrowser(path) def list_tables(self): return self.browser.list_tables() def describe_table(self, name): return self.browser.describe_table(name) def run_query(self, sql): return self.browser.execute(sql)
六、图形界面模块 ui.py
python
复制编辑
`import tkinter as tk from tkinter import ttk, filedialog, messagebox, scrolledtext from query_executor import QueryExecutor class SQLiteGUI: def init(self, root):
self.root = root
self.root.title(“SQLite 可视化助手”)
self.executor = QueryExecutor()
self.db_path = “” self.setup_ui() def setup_ui(self): # 顶部菜单 top_frame = tk.Frame(self.root)
top_frame.pack(pady=5)
tk.Button(top_frame, text=”打开数据库”, command=self.choose_db).pack(side=tk.LEFT)
self.db_label = tk.Label(top_frame, text=”未选择数据库”)
self.db_label.pack(side=tk.LEFT, padx=10) # 左侧表名列表 self.table_list = tk.Listbox(self.root, width=30)
self.table_list.pack(side=tk.LEFT, fill=tk.Y, padx=10)
self.table_list.bind(“<>”, self.on_table_select) # 中部 SQL 编辑器 mid_frame = tk.Frame(self.root)
mid_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
self.sql_text = scrolledtext.ScrolledText(mid_frame, height=5)
self.sql_text.pack(fill=tk.X)
tk.Button(mid_frame, text="执行 SQL", command=self.run_sql).pack(pady=5) # 下方结果展示 self.result_table = ttk.Treeview(self.root)
self.result_table.pack(fill=tk.BOTH, expand=True) def choose_db(self):
path = filedialog.askopenfilename(filetypes=[("SQLite DB", "*.db *.sqlite")]) if path:
self.db_path = path
self.db_label.config(text=path)
self.executor.load_db(path)
self.refresh_table_list() def refresh_table_list(self):
self.table_list.delete(0, tk.END)
tables = self.executor.list_tables() for t in tables:
self.table_list.insert(tk.END, t) def on_table_select(self, event):
idx = self.table_list.curselection() if idx:
table = self.table_list.get(idx[0])
sql = f"SELECT * FROM {table} LIMIT 100"
self.sql_text.delete("1.0", tk.END)
self.sql_text.insert(tk.END, sql) def run_sql(self):
sql = self.sql_text.get("1.0", tk.END).strip() if not sql:
messagebox.showwarning("提示", "请输入 SQL 语句") return try:
columns, rows = self.executor.run_query(sql)
self.show_result(columns, rows) except Exception as e:
messagebox.showerror("执行错误", str(e)) def show_result(self, columns, rows):
self.result_table.delete(*self.result_table.get_children())
self.result_table["columns"] = columns
self.result_table["show"] = "headings" for col in columns:
self.result_table.heading(col, text=col)
self.result_table.column(col, width=120) for row in rows:
self.result_table.insert("", tk.END, values=row) `
七、主程序入口 main.py
python
复制编辑
import tkinter as tk from ui import SQLiteGUI if __name__ == "__main__":
root = tk.Tk()
app = SQLiteGUI(root)
root.geometry("900x600")
root.mainloop()
八、使用演示
8.1 启动后界面
左侧:自动加载所有表名
中间:SQL 查询编辑框
下方:查询结果展示表格
8.2 拖拽数据库文件(可选拓展)
Tkinter 不原生支持文件拖拽,如需支持拖入
.db
自动加载可引入tkinterDnD2
。
九、扩展建议
当前工具为 SQLite 提供基础图形化查询能力,适合单人或内部使用。可进一步扩展:
方向 | 内容 |
---|---|
可视化建表 | 使用表单创建表结构 |
SQL 历史记录 | 保存查询语句与结果 |
数据导出 | 支持导出为 Excel / CSV |
数据插入 | GUI 操作插入表数据 |
表结构展示 | 表结构窗口展示字段、索引 |
多窗口支持 | 多数据库并行打开 |
十、总结
本项目是一个典型的 Python + Tkinter 桌面工具实战案例,结合 SQLite 使用场景,提供了如下价值:
图形化可操作本地数据库
无需依赖浏览器或命令行
适合开发人员、测试人员、分析师使用
极易扩展,代码结构清晰
这种工具类项目虽然冷门,但在实际开发与内部运维中常被反复使用。通过这类项目也能很好地提升你对 Python 桌面编程、数据库接口、GUI 交互逻辑等能力。
本作品采用《CC 协议》,转载必须注明作者和本文链接