• 日常搜索
  • 端口查询
  • IP查询
  • 在线工具
  • 搜本站

sqlite文件查看工具

分享个轻量轻的绿色免装sqlite查看工具,Python写的已帮你们打包成了EXE启动程序(看附件),另外附一份修复过语法的源代码,有兴趣的同学自己打包EXE。

主要功能:

1.选择数据库

支持 db、sqlite、sqlite3后缀的数据库文件

选择完数据库的成功提示,发现这个数据库重多少数据表,

2.查看数据表

列表展示,使用下拉框选择

3.查看表结构

建表语句,字段信息等

sqlite文件查看工具  第1张

4.查看表数据

列表显示

sqlite文件查看工具  第2张

5.导出数据

支持导出csv、txt

sqlite文件查看工具  第3张

打包工具:

  1. python转exe工具 V2.0

  2. 图片转ICO图标工具img2ICO

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.导出数据
  • 打包工具:
  • python代码:
  • 相关文章:
  • 附件地址:
  • 发表评论