mickeywu520's picture
first commit
cd9bca9
"""
資料庫初始化腳本
用於在 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()