分享个轻量轻的绿色免装sqlite查看工具,Python写的已帮你们打包成了EXE启动程序(看附件),另外附一份修复过语法的源代码,有兴趣的同学自己打包EXE。
主要功能:
1.选择数据库
支持 db、sqlite、sqlite3后缀的数据库文件
选择完数据库的成功提示,发现这个数据库重多少数据表,
2.查看数据表
列表展示,使用下拉框选择
3.查看表结构
建表语句,字段信息等

4.查看表数据
列表显示

5.导出数据
支持导出csv、txt

打包工具:
python代码:
import tkinter as tk
from tkinter import ttk, filedialog, messagebox, scrolledtext
import sqlite3
import os
from datetime import datetime
class SQLiteViewer:
def __init__(self, root):
self.root = root
self.root.title("SQLite可视化工具-老吴搭建教程")
self.root.geometry("1200x800")
self.root.minsize(800, 600)
# 数据库连接状态
self.db_connection = None
self.db_path = None
# 初始化UI
self.setup_ui()
def setup_ui(self):
"""设置界面布局"""
# 顶部控制面板
control_frame = ttk.Frame(self.root, padding=10)
control_frame.pack(fill=tk.X, anchor=tk.W)
# 打开数据库按钮
self.open_btn = ttk.Button(control_frame, text="选择SQLite数据库", command=self.open_database)
self.open_btn.pack(side=tk.LEFT, padx=5)
# 数据库路径显示
self.db_label = ttk.Label(control_frame, text="未选择数据库", foreground="gray")
self.db_label.pack(side=tk.LEFT, padx=10, fill=tk.X, expand=True)
# 导出按钮(默认禁用)
self.export_btn = ttk.Button(control_frame, text="导出数据", command=self.export_data, state=tk.DISABLED)
self.export_btn.pack(side=tk.RIGHT, padx=5)
# 中间选择区域
select_frame = ttk.Frame(self.root, padding=10)
select_frame.pack(fill=tk.X, anchor=tk.W)
ttk.Label(select_frame, text="数据表列表:").pack(side=tk.LEFT, padx=5)
# 表选择下拉框
self.table_var = tk.StringVar()
self.table_combobox = ttk.Combobox(select_frame, textvariable=self.table_var, state="readonly", width=30)
self.table_combobox.pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True)
self.table_combobox.bind("<<ComboboxSelected>>", self.on_table_selected)
# 底部显示区域(分为结构和数据两个标签页)
tab_control = ttk.Notebook(self.root)
tab_control.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)
# 表结构标签页
self.structure_tab = ttk.Frame(tab_control)
tab_control.add(self.structure_tab, text="表结构")
# 数据标签页
self.data_tab = ttk.Frame(tab_control)
tab_control.add(self.data_tab, text="表数据")
# 初始化表结构显示区域
self.init_structure_display()
# 初始化数据显示区域
self.init_data_display()
def init_structure_display(self):
"""初始化表结构显示区域"""
# 创建滚动文本框显示表结构
self.structure_text = scrolledtext.ScrolledText(self.structure_tab, wrap=tk.WORD, font=("Consolas", 10))
self.structure_text.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
self.structure_text.insert(tk.END, "请先选择数据库文件,然后选择数据表查看结构...")
self.structure_text.config(state=tk.DISABLED)
def init_data_display(self):
"""初始化数据显示区域"""
# 创建表格
self.data_tree = ttk.Treeview(self.data_tab, show="headings")
self.data_tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=5, pady=5)
# 添加滚动条
scrollbar = ttk.Scrollbar(self.data_tab, orient=tk.VERTICAL, command=self.data_tree.yview)
self.data_tree.configure(yscrollcommand=scrollbar.set)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y, padx=(0,5), pady=5)
# 初始提示
self.data_tree["columns"] = ("tip",)
self.data_tree.heading("tip", text="提示信息")
self.data_tree.insert("", tk.END, values=("请先选择数据库文件和数据表查看数据...",))
def open_database(self):
"""打开SQLite数据库文件"""
file_path = filedialog.askopenfilename(
title="选择SQLite数据库文件",
filetypes=[("SQLite Files", "*.db *.sqlite *.sqlite3"), ("All Files", "*.*")]
)
if not file_path:
return
try:
# 关闭之前的连接
if self.db_connection:
self.db_connection.close()
# 建立新连接
self.db_connection = sqlite3.connect(file_path)
self.db_path = file_path
# 更新界面显示
self.db_label.config(text=f"当前数据库: {os.path.basename(file_path)}", foreground="black")
self.export_btn.config(state=tk.NORMAL)
# 获取所有表名并更新下拉框
tables = self.get_all_tables()
self.table_combobox["values"] = tables
# 清空之前的显示
self.clear_structure_display()
self.clear_data_display()
if tables:
messagebox.showinfo("成功", f"成功连接数据库!共发现 {len(tables)} 个数据表")
else:
messagebox.showwarning("警告", "数据库连接成功,但未发现任何数据表")
except sqlite3.Error as e:
messagebox.showerror("错误", f"数据库连接失败:{str(e)}")
self.db_connection = None
self.db_path = None
self.db_label.config(text="连接失败", foreground="red")
self.export_btn.config(state=tk.DISABLED)
def get_all_tables(self):
"""获取数据库中所有表名"""
if not self.db_connection:
return []
cursor = self.db_connection.cursor()
# 查询所有表名(兼容不同SQLite版本)
cursor.execute(
"""SELECT name FROM sqlite_master
WHERE type='table' AND name NOT LIKE 'sqlite_%'
UNION ALL
SELECT name FROM sqlite_temp_master
WHERE type='table' AND name NOT LIKE 'sqlite_%'
ORDER BY name"""
)
tables = [row[0] for row in cursor.fetchall()]
cursor.close()
return tables
def on_table_selected(self, event):
"""当选择不同表时的处理"""
selected_table = self.table_var.get()
if not selected_table or not self.db_connection:
return
# 显示表结构
self.show_table_structure(selected_table)
# 显示表数据
self.show_table_data(selected_table)
def show_table_structure(self, table_name):
"""显示表结构信息"""
cursor = self.db_connection.cursor()
# 获取表结构(PRAGMA table_info)
cursor.execute(f"PRAGMA table_info({table_name})")
structure = cursor.fetchall()
# 获取表的创建语句
cursor.execute(f"""
SELECT sql FROM sqlite_master
WHERE name='{table_name}' AND type='table'
""")
create_sql = cursor.fetchone()
create_sql = create_sql[0] if create_sql else "未找到创建语句"
cursor.close()
# 更新显示
self.clear_structure_display()
self.structure_text.config(state=tk.NORMAL)
# 写入表基本信息
self.structure_text.insert(tk.END, f"=== 表结构:{table_name} ===\n\n")
self.structure_text.insert(tk.END, f"创建语句:\n{create_sql}\n\n")
self.structure_text.insert(tk.END, "字段信息:\n")
self.structure_text.insert(tk.END, f"{'序号':<5} {'字段名':<20} {'类型':<15} {'是否主键':<10} {'是否允许空':<10} {'默认值':<15}\n")
self.structure_text.insert(tk.END, "-" * 80 + "\n")
for field in structure:
cid, name, type_, notnull, dflt_value, pk = field
is_pk = "是" if pk else "否"
is_nullable = "否" if notnull else "是"
default = dflt_value if dflt_value is not None else "无"
self.structure_text.insert(tk.END, f"{cid:<5} {name:<20} {type_:<15} {is_pk:<10} {is_nullable:<10} {default:<15}\n")
self.structure_text.config(state=tk.DISABLED)
def show_table_data(self, table_name):
"""显示表数据"""
cursor = self.db_connection.cursor()
try:
# 获取所有数据
cursor.execute(f"SELECT * FROM {table_name}")
data = cursor.fetchall()
# 获取字段名
cursor.execute(f"PRAGMA table_info({table_name})")
columns = [row[1] for row in cursor.fetchall()]
cursor.close()
# 清空之前的数据
self.clear_data_display()
# 设置表格列
self.data_tree["columns"] = columns
for col in columns:
self.data_tree.heading(col, text=col)
self.data_tree.column(col, width=120, anchor=tk.CENTER)
# 插入数据
if data:
for i, row in enumerate(data):
# 处理None值
formatted_row = [str(val) if val is not None else "NULL" for val in row]
self.data_tree.insert("", tk.END, iid=i, values=formatted_row)
else:
# 没有数据时显示提示
self.data_tree.insert("", tk.END, values=("该表暂无数据",) * len(columns))
except sqlite3.Error as e:
messagebox.showerror("错误", f"查询数据失败:{str(e)}")
self.clear_data_display()
self.data_tree["columns"] = ("error",)
self.data_tree.heading("error", text="错误信息")
self.data_tree.insert("", tk.END, values=(f"查询失败:{str(e)}",))
def clear_structure_display(self):
"""清空表结构显示"""
self.structure_text.config(state=tk.NORMAL)
self.structure_text.delete(1.0, tk.END)
self.structure_text.config(state=tk.DISABLED)
def clear_data_display(self):
"""清空数据表格"""
# 删除所有列
for col in self.data_tree["columns"]:
self.data_tree.heading(col, text="")
self.data_tree["columns"] = ()
# 删除所有行
for item in self.data_tree.get_children():
self.data_tree.delete(item)
def export_data(self):
"""导出当前表的数据"""
selected_table = self.table_var.get()
if not selected_table or not self.db_connection:
messagebox.showwarning("警告", "请先选择数据库和数据表")
return
# 选择保存路径
file_path = filedialog.asksaveasfilename(
title="导出数据",
defaultextension=".csv",
filetypes=[("CSV文件", "*.csv"), ("文本文件", "*.txt"), ("所有文件", "*.*")]
)
if not file_path:
return
cursor = self.db_connection.cursor()
try:
# 获取字段名和数据
cursor.execute(f"PRAGMA table_info({selected_table})")
columns = [row[1] for row in cursor.fetchall()]
cursor.execute(f"SELECT * FROM {selected_table}")
data = cursor.fetchall()
cursor.close()
# 写入文件
with open(file_path, "w", encoding="utf-8-sig", newline="") as f:
# 写入表头
f.write(",".join(columns) + "\n")
# 写入数据
for row in data:
# 处理字符串中的逗号和换行符,处理None值
formatted_row = []
for val in row:
if val is None:
formatted_val = "NULL"
elif isinstance(val, str):
# 字符串包含逗号或换行符时需要用引号包裹
if "," in val or "\n" in val or '"' in val:
formatted_val = '"' + val.replace('"', '""') + '"'
else:
formatted_val = val
else:
formatted_val = str(val)
formatted_row.append(formatted_val)
f.write(",".join(formatted_row) + "\n")
messagebox.showinfo("成功", f"数据已成功导出到:\n{file_path}")
except Exception as e:
messagebox.showerror("错误", f"导出数据失败:{str(e)}")
def __del__(self):
"""程序退出时关闭数据库连接"""
if self.db_connection:
self.db_connection.close()
if __name__ == "__main__":
root = tk.Tk()
app = SQLiteViewer(root)
root.mainloop()END!!!
相关文章:
附件地址:
附件为:SQLite可视化工具.exe
- 1.选择数据库
- 2.查看数据表
- 3.查看表结构
- 4.查看表数据
- 5.导出数据

































发表评论