Files
FoodEveryWhere/create_tables.py
2025-09-16 13:18:17 +08:00

170 lines
5.6 KiB
Python

import mysql.connector
from mysql.connector import errorcode
from faker import Faker
import random
from datetime import date, timedelta
# --- 資料庫連線資訊 ---
DB_CONFIG = {
'user': 'A023',
'password': 'UkrHhx76kCCM',
'host': 'mysql.theaken.com',
'port': 33306,
'database': 'db_A023',
}
# --- 資料表建立 SQL 指令 ---
TABLES = {}
TABLES['menu_items'] = (
"CREATE TABLE `menu_items` ("
" `id` INT NOT NULL AUTO_INCREMENT,"
" `main_course` NVARCHAR(255) NOT NULL,"
" `side_dish` NVARCHAR(255),"
" `addon` NVARCHAR(255),"
" `menu_date` DATE NOT NULL,"
" PRIMARY KEY (`id`)"
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4")
TABLES['employee_order'] = (
"CREATE TABLE `employee_order` ("
" `id` INT NOT NULL AUTO_INCREMENT,"
" `emp_id` NVARCHAR(50) NOT NULL,"
" `name` NVARCHAR(100) NOT NULL,"
" `order_date` DATE NOT NULL,"
" `menu_item_id` INT NOT NULL,"
" `order_qty` INT NOT NULL DEFAULT 1,"
" `update_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,"
" `update_by` NVARCHAR(50) NOT NULL,"
" PRIMARY KEY (`id`),"
" CONSTRAINT `fk_menu_item` FOREIGN KEY (`menu_item_id`)"
" REFERENCES `menu_items` (`id`)"
" ON DELETE CASCADE"
" ON UPDATE CASCADE"
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4")
def insert_fake_data(cnx):
"""
在資料表中新增 50 筆隨機假資料
"""
cursor = cnx.cursor()
fake = Faker('zh_TW')
# --- 準備假資料 ---
# 菜色選項
main_courses = ['排骨飯', '雞腿飯', '牛肉麵', '海鮮義大利麵', '日式豬排丼', '韓式拌飯', '總匯三明治', '烤雞潛艇堡']
side_dishes = ['燙青菜', '滷豆腐', '涼拌小黃瓜', '茶碗蒸', '薯條', '和風沙拉']
addons = ['玉米濃湯', '味噌湯', '紅茶', '綠茶', '提拉米蘇', '水果拼盤']
# 1. 新增 50 筆菜單資料 (menu_items)
menu_items_data = []
start_date = date.today()
for i in range(50):
menu_items_data.append((
random.choice(main_courses),
random.choice(side_dishes),
random.choice(addons),
start_date + timedelta(days=i) # 讓菜單日期每天不一樣
))
add_menu_item = ("INSERT INTO menu_items "
"(main_course, side_dish, addon, menu_date) "
"VALUES (%s, %s, %s, %s)")
try:
print("正在新增 50 筆菜單資料...", end='')
cursor.executemany(add_menu_item, menu_items_data)
cnx.commit() # 確認寫入
print("OK")
except mysql.connector.Error as err:
print(f"失敗: {err}")
cnx.rollback()
# 取得剛剛新增的 50 筆菜單的 ID
cursor.execute("SELECT id FROM menu_items ORDER BY id DESC LIMIT 50")
menu_item_ids = [item[0] for item in cursor.fetchall()]
menu_item_ids.reverse() # 確保 ID 順序正確
# 2. 新增 50 筆訂單資料 (employee_order)
employee_orders_data = []
for i in range(50):
emp_id = f'A{random.randint(100, 999)}'
order_date = random.choice(menu_items_data)[3] # 從菜單日期中隨機選一天
employee_orders_data.append((
emp_id,
fake.name(),
order_date,
random.choice(menu_item_ids), # 從已存在的菜單ID中隨機選一個
random.randint(1, 3), # 訂購數量 1-3 份
emp_id
))
add_employee_order = ("INSERT INTO employee_order "
"(emp_id, name, order_date, menu_item_id, order_qty, update_by) "
"VALUES (%s, %s, %s, %s, %s, %s)")
try:
print("正在新增 50 筆訂單資料...", end='')
cursor.executemany(add_employee_order, employee_orders_data)
cnx.commit()
print("OK")
except mysql.connector.Error as err:
print(f"失敗: {err}")
cnx.rollback()
cursor.close()
def create_tables(cnx):
"""
建立資料表
"""
cursor = cnx.cursor()
for table_name in TABLES:
table_description = TABLES[table_name]
try:
print(f"正在建立資料表 '{table_name}'... ", end='')
cursor.execute(table_description)
except mysql.connector.Error as err:
if err.errno == errorcode.ER_TABLE_EXISTS_ERROR:
print("資料表已存在。")
else:
print(err.msg)
else:
print("OK")
cursor.close()
def main():
"""
主執行函式,連線資料庫、建立資料表並新增假資料
"""
cnx = None # 初始化 cnx
try:
# 建立資料庫連線
cnx = mysql.connector.connect(**DB_CONFIG)
print("資料庫連線成功!")
# 1. 建立資料表
create_tables(cnx)
# 2. 新增假資料
# 詢問使用者是否要新增假資料
user_input = input("是否要新增 50 筆假資料? (y/n): ")
if user_input.lower() == 'y':
insert_fake_data(cnx)
else:
print("已跳過新增假資料的步驟。")
except mysql.connector.Error as err:
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
print("存取被拒絕,請檢查您的使用者名稱或密碼。")
elif err.errno == errorcode.ER_BAD_DB_ERROR:
print("資料庫不存在。")
else:
print(f"連線失敗:{err}")
finally:
# 關閉連線
if cnx and cnx.is_connected():
cnx.close()
print("資料庫連線已關閉。")
if __name__ == '__main__':
main()