2025年10月16日 星期四

SQLite 資料庫 -1

 SQLite 資料庫 <1




資料表結構「科系代表碼」,提供六個功能:

1️⃣ 建立資料庫與資料表
2️⃣ 新增資料
3️⃣ 更正資料
4️⃣ 刪除資料
5️⃣ 顯示所有資料
6️⃣ 刪除整個資料庫


功能說明

功能動作說明
建立資料庫建立 MySchoolDB.db 並新增 department 資料表
新增資料輸入系碼、系名、系主任後按新增
更正資料以「系碼」為主鍵更新系名與系主任
刪除資料依系碼刪除資料
顯示所有資料顯示目前所有資料於表格
刪除資料庫刪除整個 department.db 檔案

Python+TKinter 程式

import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3
import os

DB_NAME = "MySchoolDB.db"   # ✅ 改為 MySchoolDB.db

# === 建立資料庫 ===
def create_db():
    if os.path.exists(DB_NAME):
        messagebox.showinfo("訊息", "資料庫已存在!")
    else:
        conn = sqlite3.connect(DB_NAME)
        cursor = conn.cursor()
        cursor.execute('''
            CREATE TABLE department (
                系碼 CHAR(10) NOT NULL PRIMARY KEY,
                系名 VARCHAR(50),
                系主任 VARCHAR(50)
            )
        ''')
        conn.commit()
        conn.close()
        messagebox.showinfo("訊息", f"{DB_NAME} 與資料表已建立完成!")

# === 新增資料 ===
def add_data():
    if not os.path.exists(DB_NAME):
        messagebox.showwarning("警告", "請先建立資料庫!")
        return

    dept_id = entry_id.get().strip()
    dept_name = entry_name.get().strip()
    dept_head = entry_head.get().strip()

    if dept_id == "":
        messagebox.showwarning("警告", "系碼不可為空!")
        return

    conn = sqlite3.connect(DB_NAME)
    cursor = conn.cursor()
    try:
        cursor.execute("INSERT INTO department VALUES (?, ?, ?)", (dept_id, dept_name, dept_head))
        conn.commit()
        messagebox.showinfo("成功", "資料已新增!")
        show_all()
    except sqlite3.IntegrityError:
        messagebox.showerror("錯誤", "該系碼已存在!")
    conn.close()

# === 更正資料 ===
def update_data():
    dept_id = entry_id.get().strip()
    dept_name = entry_name.get().strip()
    dept_head = entry_head.get().strip()

    if dept_id == "":
        messagebox.showwarning("警告", "請輸入要更正的系碼!")
        return

    conn = sqlite3.connect(DB_NAME)
    cursor = conn.cursor()
    cursor.execute("UPDATE department SET 系名=?, 系主任=? WHERE 系碼=?", (dept_name, dept_head, dept_id))
    conn.commit()
    conn.close()
    messagebox.showinfo("成功", "資料已更新!")
    show_all()

# === 刪除資料 ===
def delete_data():
    dept_id = entry_id.get().strip()
    if dept_id == "":
        messagebox.showwarning("警告", "請輸入要刪除的系碼!")
        return

    conn = sqlite3.connect(DB_NAME)
    cursor = conn.cursor()
    cursor.execute("DELETE FROM department WHERE 系碼=?", (dept_id,))
    conn.commit()
    conn.close()
    messagebox.showinfo("成功", "資料已刪除!")
    show_all()

# === 顯示所有資料 ===
def show_all():
    if not os.path.exists(DB_NAME):
        messagebox.showwarning("警告", "請先建立資料庫!")
        return

    for row in tree.get_children():
        tree.delete(row)

    conn = sqlite3.connect(DB_NAME)
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM department")
    rows = cursor.fetchall()
    for row in rows:
        tree.insert("", "end", values=row)
    conn.close()

# === 刪除資料庫 ===
def delete_db():
    if os.path.exists(DB_NAME):
        os.remove(DB_NAME)
        for row in tree.get_children():
            tree.delete(row)
        messagebox.showinfo("成功", f"{DB_NAME} 已刪除!")
    else:
        messagebox.showwarning("警告", "資料庫不存在!")

# === Tkinter 介面 ===
root = tk.Tk()
root.title("科系代表碼管理系統")
root.geometry("650x500")

frame_top = tk.Frame(root)
frame_top.pack(pady=10)

tk.Label(frame_top, text="系碼:").grid(row=0, column=0, padx=5, pady=5)
entry_id = tk.Entry(frame_top)
entry_id.grid(row=0, column=1, padx=5)

tk.Label(frame_top, text="系名:").grid(row=1, column=0, padx=5, pady=5)
entry_name = tk.Entry(frame_top)
entry_name.grid(row=1, column=1, padx=5)

tk.Label(frame_top, text="系主任:").grid(row=2, column=0, padx=5, pady=5)
entry_head = tk.Entry(frame_top)
entry_head.grid(row=2, column=1, padx=5)

frame_btn = tk.Frame(root)
frame_btn.pack(pady=10)

ttk.Button(frame_btn, text="建立資料庫", command=create_db).grid(row=0, column=0, padx=5)
ttk.Button(frame_btn, text="新增資料", command=add_data).grid(row=0, column=1, padx=5)
ttk.Button(frame_btn, text="更正資料", command=update_data).grid(row=0, column=2, padx=5)
ttk.Button(frame_btn, text="刪除資料", command=delete_data).grid(row=0, column=3, padx=5)
ttk.Button(frame_btn, text="顯示所有資料", command=show_all).grid(row=0, column=4, padx=5)
ttk.Button(frame_btn, text="刪除資料庫", command=delete_db).grid(row=0, column=5, padx=5)

# === Treeview 顯示區 ===
tree = ttk.Treeview(root, columns=("系碼", "系名", "系主任"), show="headings", height=10)
tree.heading("系碼", text="系碼")
tree.heading("系名", text="系名")
tree.heading("系主任", text="系主任")
tree.pack(pady=10, fill="x")

root.mainloop()

沒有留言:

張貼留言

WOKWI 模擬 MFRC522 RFID Reader + 5個 Tag 發行到MQTT 上

WOKWI 模擬 MFRC522 RFID Reader + 5個 Tag  發行到MQTT 上 MQTTgo.io # MQTT 設定 MQTT_BROKER = "mqttgo.io" MQTT_PORT = 1883 MQTT_TOPIC = ...