|
""" |
|
資料庫初始化腳本 |
|
用於在 Supabase 中建立必要的資料表 |
|
""" |
|
|
|
from supabase import create_client |
|
from backend.config import settings |
|
import logging |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
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}") |
|
|
|
|
|
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() |