170 lines
5.6 KiB
Python
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() |