# -*- coding: utf-8 -*- import os import sys from sqlalchemy import inspect, text # 將專案根目錄加入 sys.path 以便讀取模組 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, BASE_DIR) try: from database.manager import DatabaseManager except ImportError: print("❌ 無法導入 DatabaseManager,請確認您在專案根目錄下執行此腳本。") sys.exit(1) def clear_table(): """清空指定的資料表""" table_name = 'realtime_sales_monthly' # V-Fix: 直接使用當前腳本路徑計算資料庫位置,確保與 app.py 一致 (修正路徑問題) db_path = os.path.join(BASE_DIR, 'data', 'momo_database.db') print(f"🚀 準備清空資料表: {table_name}") print(f"📂 目標資料庫路徑: {db_path}") db = DatabaseManager(db_path=db_path) engine = db.engine try: inspector = inspect(engine) if not inspector.has_table(table_name): print(f"ℹ️ 資料表 '{table_name}' 不存在,無需清空。") return with engine.connect() as conn: # 1. 查詢目前筆數 count = conn.execute(text(f"SELECT COUNT(*) FROM {table_name}")).scalar() conn.commit() # 提交隱式交易,避免鎖定 if count == 0: print("⚠️ 資料表已空,無需執行。") return print(f"📊 目前共有 {count} 筆資料。") # 2. 確認刪除 confirm = input("⚠️ 警告:確定要【永久刪除 (DROP TABLE)】所有資料嗎?(y/n): ") if confirm.lower() == 'y': print("⏳ 正在執行刪除...") # V-Fix: 安全修復邏輯 try: # 1. 嘗試強制寫入 WAL 暫存檔,解決鎖定問題 conn.execute(text("PRAGMA wal_checkpoint(TRUNCATE)")) # 2. 僅刪除指定的業績報表 with conn.begin(): conn.execute(text(f"DROP TABLE IF EXISTS {table_name}")) # 3. 重整資料庫檔案 (釋放空間並修復可能的頁面錯誤) conn.execute(text("VACUUM")) print(f"✅ 成功刪除資料表 '{table_name}' 並完成資料庫重整。") print("✅ 其他資料 (商品、價格紀錄) 均已保留。") except Exception as db_err: print(f"❌ 資料庫操作失敗: {db_err}") print("👉 請務必先【關閉 app.py】再執行此腳本!") return print("==========================================") print("⚠️ 重要提示:請務必【重新啟動 app.py】以清除網頁快取,否則網頁上可能仍會顯示舊資料!") print("==========================================") else: print("已取消操作。") except Exception as e: print(f"❌ 發生錯誤: {e}") if __name__ == "__main__": clear_table()