Skip to content

GUI-based SQL Database Viewer

Abstract

Build a GUI-based SQL Database Viewer that allows users to connect to a database, execute SQL queries, and view results in a table format. This project demonstrates database interaction, SQL query execution, and GUI development in Python.

Prerequisites

  • Python 3.6 or above
  • Text Editor or IDE
  • Basic understanding of Python syntax
  • Familiarity with Tkinter for GUI development
  • Knowledge of SQL and database operations

Getting Started

Creating a new project

  1. Create a new project folder and name it gui_sql_database_viewergui_sql_database_viewer.
  2. Create a new file inside the folder and name it gui_sql_database_viewer.pygui_sql_database_viewer.py.
  3. Open the project folder in your favorite text editor or IDE.
  4. Copy the code below and paste it into the gui_sql_database_viewer.pygui_sql_database_viewer.py file.

Write the code

โš™๏ธ gui_sql_database_viewer.py
gui_sql_database_viewer.py
"""
GUI-based SQL Database Viewer
 
A Python application with a graphical user interface to view and interact with SQL databases. Features include:
- Connecting to a database.
- Executing SQL queries.
- Displaying query results in a table format.
"""
 
import sqlite3
from tkinter import Tk, Label, Entry, Button, Text, Scrollbar, messagebox, END
from tkinter.ttk import Treeview
 
 
class SQLDatabaseViewer:
    def __init__(self, root):
        self.root = root
        self.root.title("SQL Database Viewer")
 
        Label(root, text="Database Path:").grid(row=0, column=0, padx=10, pady=10)
        self.db_entry = Entry(root, width=50)
        self.db_entry.grid(row=0, column=1, padx=10, pady=10)
 
        Button(root, text="Connect", command=self.connect_to_db).grid(row=0, column=2, padx=10, pady=10)
 
        Label(root, text="Enter SQL Query:").grid(row=1, column=0, padx=10, pady=10)
        self.query_text = Text(root, height=5, width=60)
        self.query_text.grid(row=1, column=1, columnspan=2, padx=10, pady=10)
 
        Button(root, text="Execute", command=self.execute_query).grid(row=2, column=1, pady=10)
 
        self.result_tree = Treeview(root, columns=("#1", "#2", "#3"), show="headings")
        self.result_tree.grid(row=3, column=0, columnspan=3, padx=10, pady=10)
 
        scrollbar = Scrollbar(root, command=self.result_tree.yview)
        scrollbar.grid(row=3, column=3, sticky="ns")
        self.result_tree.configure(yscrollcommand=scrollbar.set)
 
        self.connection = None
 
    def connect_to_db(self):
        """Connect to the SQLite database."""
        db_path = self.db_entry.get()
        try:
            self.connection = sqlite3.connect(db_path)
            messagebox.showinfo("Success", "Connected to the database successfully.")
        except sqlite3.Error as e:
            messagebox.showerror("Error", f"Failed to connect to the database: {e}")
 
    def execute_query(self):
        """Execute the SQL query and display results."""
        if not self.connection:
            messagebox.showerror("Error", "Please connect to a database first.")
            return
 
        query = self.query_text.get("1.0", END).strip()
        if not query:
            messagebox.showerror("Error", "Please enter an SQL query.")
            return
 
        try:
            cursor = self.connection.cursor()
            cursor.execute(query)
            self.connection.commit()
 
            # Clear previous results
            for item in self.result_tree.get_children():
                self.result_tree.delete(item)
 
            # Display results
            columns = [description[0] for description in cursor.description] if cursor.description else []
            self.result_tree["columns"] = columns
 
            for col in columns:
                self.result_tree.heading(col, text=col)
 
            for row in cursor.fetchall():
                self.result_tree.insert("", END, values=row)
 
            messagebox.showinfo("Success", "Query executed successfully.")
        except sqlite3.Error as e:
            messagebox.showerror("Error", f"Failed to execute query: {e}")
 
 
def main():
    root = Tk()
    app = SQLDatabaseViewer(root)
    root.mainloop()
 
 
if __name__ == "__main__":
    main()
 
gui_sql_database_viewer.py
"""
GUI-based SQL Database Viewer
 
A Python application with a graphical user interface to view and interact with SQL databases. Features include:
- Connecting to a database.
- Executing SQL queries.
- Displaying query results in a table format.
"""
 
import sqlite3
from tkinter import Tk, Label, Entry, Button, Text, Scrollbar, messagebox, END
from tkinter.ttk import Treeview
 
 
class SQLDatabaseViewer:
    def __init__(self, root):
        self.root = root
        self.root.title("SQL Database Viewer")
 
        Label(root, text="Database Path:").grid(row=0, column=0, padx=10, pady=10)
        self.db_entry = Entry(root, width=50)
        self.db_entry.grid(row=0, column=1, padx=10, pady=10)
 
        Button(root, text="Connect", command=self.connect_to_db).grid(row=0, column=2, padx=10, pady=10)
 
        Label(root, text="Enter SQL Query:").grid(row=1, column=0, padx=10, pady=10)
        self.query_text = Text(root, height=5, width=60)
        self.query_text.grid(row=1, column=1, columnspan=2, padx=10, pady=10)
 
        Button(root, text="Execute", command=self.execute_query).grid(row=2, column=1, pady=10)
 
        self.result_tree = Treeview(root, columns=("#1", "#2", "#3"), show="headings")
        self.result_tree.grid(row=3, column=0, columnspan=3, padx=10, pady=10)
 
        scrollbar = Scrollbar(root, command=self.result_tree.yview)
        scrollbar.grid(row=3, column=3, sticky="ns")
        self.result_tree.configure(yscrollcommand=scrollbar.set)
 
        self.connection = None
 
    def connect_to_db(self):
        """Connect to the SQLite database."""
        db_path = self.db_entry.get()
        try:
            self.connection = sqlite3.connect(db_path)
            messagebox.showinfo("Success", "Connected to the database successfully.")
        except sqlite3.Error as e:
            messagebox.showerror("Error", f"Failed to connect to the database: {e}")
 
    def execute_query(self):
        """Execute the SQL query and display results."""
        if not self.connection:
            messagebox.showerror("Error", "Please connect to a database first.")
            return
 
        query = self.query_text.get("1.0", END).strip()
        if not query:
            messagebox.showerror("Error", "Please enter an SQL query.")
            return
 
        try:
            cursor = self.connection.cursor()
            cursor.execute(query)
            self.connection.commit()
 
            # Clear previous results
            for item in self.result_tree.get_children():
                self.result_tree.delete(item)
 
            # Display results
            columns = [description[0] for description in cursor.description] if cursor.description else []
            self.result_tree["columns"] = columns
 
            for col in columns:
                self.result_tree.heading(col, text=col)
 
            for row in cursor.fetchall():
                self.result_tree.insert("", END, values=row)
 
            messagebox.showinfo("Success", "Query executed successfully.")
        except sqlite3.Error as e:
            messagebox.showerror("Error", f"Failed to execute query: {e}")
 
 
def main():
    root = Tk()
    app = SQLDatabaseViewer(root)
    root.mainloop()
 
 
if __name__ == "__main__":
    main()
 

Key Features

  • Connect to a database
  • Execute SQL queries
  • Display query results in a table format
  • GUI interface for user interaction

Explanation

Connecting to Database

The app allows users to enter a database path and connect:

gui_sql_database_viewer.py
Label(root, text="Database Path:").grid(row=0, column=0, padx=10, pady=10)
self.db_entry = Entry(root, width=50)
self.db_entry.grid(row=0, column=1, padx=10, pady=10)
Button(root, text="Connect", command=self.connect_to_db).grid(row=0, column=2, padx=10, pady=10)
gui_sql_database_viewer.py
Label(root, text="Database Path:").grid(row=0, column=0, padx=10, pady=10)
self.db_entry = Entry(root, width=50)
self.db_entry.grid(row=0, column=1, padx=10, pady=10)
Button(root, text="Connect", command=self.connect_to_db).grid(row=0, column=2, padx=10, pady=10)

Executing SQL Queries

Users can enter SQL queries and execute them:

gui_sql_database_viewer.py
Label(root, text="Enter SQL Query:").grid(row=1, column=0, padx=10, pady=10)
self.query_text = Text(root, height=5, width=60)
self.query_text.grid(row=1, column=1, columnspan=2, padx=10, pady=10)
Button(root, text="Execute", command=self.execute_query).grid(row=2, column=1, pady=10)
gui_sql_database_viewer.py
Label(root, text="Enter SQL Query:").grid(row=1, column=0, padx=10, pady=10)
self.query_text = Text(root, height=5, width=60)
self.query_text.grid(row=1, column=1, columnspan=2, padx=10, pady=10)
Button(root, text="Execute", command=self.execute_query).grid(row=2, column=1, pady=10)

Displaying Results

Query results are shown in a table using Tkinterโ€™s Treeview widget:

gui_sql_database_viewer.py
self.result_tree = Treeview(root, columns=("#1", "#2", "#3"), show="headings")
self.result_tree.grid(row=3, column=0, columnspan=3, padx=10, pady=10)
gui_sql_database_viewer.py
self.result_tree = Treeview(root, columns=("#1", "#2", "#3"), show="headings")
self.result_tree.grid(row=3, column=0, columnspan=3, padx=10, pady=10)

Running the Application

  1. Save the file.
  2. Install required dependencies:
pip install sqlite3
pip install sqlite3
  1. Run the application:
python gui_sql_database_viewer.py
python gui_sql_database_viewer.py

Conclusion

This GUI-based SQL Database Viewer project is a great way to learn about database interaction and GUI development in Python. You can extend it by adding support for more database types, query history, or export features.

Was this page helpful?

Let us know how we did