Initial commit
This commit is contained in:
170
create_tables.py
Normal file
170
create_tables.py
Normal file
@@ -0,0 +1,170 @@
|
||||
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()
|
Reference in New Issue
Block a user