File size: 4,639 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
"""
資料庫初始化腳本
用於在 Supabase 中建立必要的資料表
"""

from supabase import create_client
from backend.config import settings
import logging

logger = logging.getLogger(__name__)

# SQL 建表語句
CREATE_TABLES_SQL = {
    "users": """
    CREATE TABLE IF NOT EXISTS users (
        user_id VARCHAR(255) PRIMARY KEY,
        name VARCHAR(255),
        email VARCHAR(255),
        display_name VARCHAR(255),
        picture_url TEXT,
        status_message TEXT,
        created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
        updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
    );
    """,
    
    "products": """
    CREATE TABLE IF NOT EXISTS products (
        product_id SERIAL PRIMARY KEY,
        name VARCHAR(255) NOT NULL,
        description TEXT,
        price DECIMAL(10,2) NOT NULL,
        stock INTEGER DEFAULT 0,
        category VARCHAR(100),
        image_url TEXT,
        created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
        updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
    );
    """,
    
    "orders": """
    CREATE TABLE IF NOT EXISTS orders (
        order_id VARCHAR(255) PRIMARY KEY,
        user_id VARCHAR(255) REFERENCES users(user_id),
        total_amount DECIMAL(10,2) NOT NULL,
        status VARCHAR(50) DEFAULT 'pending',
        shipping_address TEXT,
        created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
        updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
    );
    """,
    
    "order_items": """
    CREATE TABLE IF NOT EXISTS order_items (
        id SERIAL PRIMARY KEY,
        order_id VARCHAR(255) REFERENCES orders(order_id),
        product_id INTEGER REFERENCES products(product_id),
        quantity INTEGER NOT NULL,
        unit_price DECIMAL(10,2) NOT NULL,
        created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
    );
    """,
    
    "line_messages": """
    CREATE TABLE IF NOT EXISTS line_messages (
        id SERIAL PRIMARY KEY,
        user_id VARCHAR(255),
        message TEXT NOT NULL,
        message_type VARCHAR(50) DEFAULT 'text',
        timestamp TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
        processed BOOLEAN DEFAULT FALSE
    );
    """,
    
    "user_sessions": """
    CREATE TABLE IF NOT EXISTS user_sessions (
        id SERIAL PRIMARY KEY,
        user_id VARCHAR(255) REFERENCES users(user_id),
        session_data JSONB,
        created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
        updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
    );
    """
}

# 範例資料
SAMPLE_DATA = {
    "products": [
        {
            "name": "iPhone 15 Pro",
            "description": "最新款 iPhone,配備 A17 Pro 晶片",
            "price": 35900,
            "stock": 50,
            "category": "手機"
        },
        {
            "name": "MacBook Air M2",
            "description": "輕薄筆記型電腦,搭載 M2 晶片",
            "price": 37900,
            "stock": 30,
            "category": "筆電"
        },
        {
            "name": "AirPods Pro",
            "description": "主動降噪無線耳機",
            "price": 7490,
            "stock": 100,
            "category": "耳機"
        }
    ]
}

def init_database():
    """初始化資料庫"""
    try:
        supabase = create_client(settings.SUPABASE_URL, settings.SUPABASE_KEY)
        
        logger.info("開始初始化資料庫...")
        
        # 建立資料表
        for table_name, sql in CREATE_TABLES_SQL.items():
            try:
                logger.info(f"建立資料表: {table_name}")
                # 注意:Supabase 的 Python 客戶端可能不直接支援 SQL 執行
                # 您需要在 Supabase Dashboard 的 SQL Editor 中執行這些 SQL
                print(f"\n=== {table_name.upper()} TABLE SQL ===")
                print(sql)
                
            except Exception as e:
                logger.error(f"建立資料表 {table_name} 失敗: {str(e)}")
        
        # 插入範例資料
        logger.info("插入範例資料...")
        for table_name, data in SAMPLE_DATA.items():
            try:
                result = supabase.table(table_name).insert(data).execute()
                logger.info(f"成功插入 {len(result.data)} 筆資料到 {table_name}")
            except Exception as e:
                logger.warning(f"插入範例資料到 {table_name} 失敗: {str(e)}")
        
        logger.info("資料庫初始化完成!")
        return True
        
    except Exception as e:
        logger.error(f"資料庫初始化失敗: {str(e)}")
        return False

if __name__ == "__main__":
    init_database()