File size: 4,468 Bytes
cd9bca9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
"""
資料庫初始化腳本
使用 SQLAlchemy 建立資料表和插入範例資料
"""

from sqlalchemy import create_engine
from backend.database.connection import Base, engine
from backend.database.models import User, Product, Order, OrderItem, LineMessage, UserSession
from backend.config import settings
import logging

logger = logging.getLogger(__name__)

def create_tables():
    """建立所有資料表"""
    try:
        logger.info("開始建立資料表...")
        Base.metadata.create_all(bind=engine)
        logger.info("資料表建立完成!")
        return True
    except Exception as e:
        logger.error(f"建立資料表失敗: {str(e)}")
        return False

def insert_sample_data():
    """插入範例資料"""
    from backend.database.connection import SessionLocal
    
    db = SessionLocal()
    try:
        logger.info("開始插入範例資料...")
        
        # 檢查是否已有資料
        existing_products = db.query(Product).count()
        if existing_products > 0:
            logger.info("資料表已有資料,跳過範例資料插入")
            return True
        
        # 插入範例商品
        sample_products = [
            Product(
                name="iPhone 15 Pro",
                description="最新款 iPhone,配備 A17 Pro 晶片",
                price=35900,
                stock=50,
                category="手機"
            ),
            Product(
                name="MacBook Air M2",
                description="輕薄筆記型電腦,搭載 M2 晶片",
                price=37900,
                stock=30,
                category="筆電"
            ),
            Product(
                name="AirPods Pro",
                description="主動降噪無線耳機",
                price=7490,
                stock=100,
                category="耳機"
            ),
            Product(
                name="iPad Air",
                description="輕薄平板電腦,適合工作和娛樂",
                price=18900,
                stock=25,
                category="平板"
            ),
            Product(
                name="Apple Watch Series 9",
                description="智慧手錶,健康監測功能",
                price=12900,
                stock=40,
                category="穿戴裝置"
            )
        ]
        
        for product in sample_products:
            db.add(product)
        
        # 插入範例用戶
        sample_users = [
            User(
                user_id="U001",
                name="張小明",
                email="ming@example.com",
                display_name="小明"
            ),
            User(
                user_id="U002", 
                name="李小華",
                email="hua@example.com",
                display_name="小華"
            ),
            User(
                user_id="U003",
                name="王小美",
                email="mei@example.com", 
                display_name="小美"
            )
        ]
        
        for user in sample_users:
            db.add(user)
        
        # 提交變更
        db.commit()
        logger.info("範例資料插入完成!")
        return True
        
    except Exception as e:
        db.rollback()
        logger.error(f"插入範例資料失敗: {str(e)}")
        return False
    finally:
        db.close()

def init_database():
    """初始化資料庫"""
    logger.info("=== 開始初始化資料庫 ===")
    
    # 建立資料表
    if not create_tables():
        logger.error("資料表建立失敗,停止初始化")
        return False
    
    # 插入範例資料
    if not insert_sample_data():
        logger.error("範例資料插入失敗")
        return False
    
    logger.info("=== 資料庫初始化完成 ===")
    return True

def drop_all_tables():
    """刪除所有資料表(謹慎使用)"""
    try:
        logger.warning("正在刪除所有資料表...")
        Base.metadata.drop_all(bind=engine)
        logger.warning("所有資料表已刪除!")
        return True
    except Exception as e:
        logger.error(f"刪除資料表失敗: {str(e)}")
        return False

if __name__ == "__main__":
    import sys
    
    if len(sys.argv) > 1 and sys.argv[1] == "--drop":
        # 刪除並重建資料表
        drop_all_tables()
        init_database()
    else:
        # 正常初始化
        init_database()