#!/usr/bin/env python3 # -*- coding: utf-8 -*- """数据库迁移脚本 - 简化版""" import sys import pymysql # 数据库配置(从 lib/db.ts 获取) DB_CONFIG = { 'host': '56b4c23f6853c.gz.cdb.myqcloud.com', 'port': 14413, 'user': 'cdb_outerroot', 'password': 'Zhiqun1984', 'database': 'soul_miniprogram', 'charset': 'utf8mb4' } def execute_sql(cursor, sql, description): """执行SQL并打印结果""" try: cursor.execute(sql) print(f"[OK] {description}") return True except pymysql.err.OperationalError as e: if 'Duplicate' in str(e) or 'already exists' in str(e): print(f"[SKIP] {description} (already exists)") return True else: print(f"[ERROR] {description}: {e}") return False except Exception as e: print(f"[ERROR] {description}: {e}") return False def main(): print("="*60) print("Database Migration: referral_bindings table upgrade") print("="*60) print() try: # 连接数据库 print("Connecting to database...") conn = pymysql.connect(**DB_CONFIG) cursor = conn.cursor() print(f"[OK] Connected to: {DB_CONFIG['database']}") print() except Exception as e: print(f"[ERROR] Database connection failed: {e}") sys.exit(1) # 1. 添加新字段 print("Step 1: Adding new fields") print("-"*60) execute_sql( cursor, """ALTER TABLE referral_bindings ADD COLUMN last_purchase_date DATETIME NULL COMMENT 'Last purchase time'""", "Add field: last_purchase_date" ) execute_sql( cursor, """ALTER TABLE referral_bindings ADD COLUMN purchase_count INT DEFAULT 0 COMMENT 'Purchase count'""", "Add field: purchase_count" ) execute_sql( cursor, """ALTER TABLE referral_bindings ADD COLUMN total_commission DECIMAL(10,2) DEFAULT 0.00 COMMENT 'Total commission'""", "Add field: total_commission" ) print() # 2. 添加索引 print("Step 2: Adding indexes") print("-"*60) execute_sql( cursor, """ALTER TABLE referral_bindings ADD INDEX idx_referee_status (referee_id, status)""", "Add index: idx_referee_status" ) execute_sql( cursor, """ALTER TABLE referral_bindings ADD INDEX idx_expiry_purchase (expiry_date, purchase_count, status)""", "Add index: idx_expiry_purchase" ) print() # 3. 修改 status 枚举 print("Step 3: Updating status enum") print("-"*60) execute_sql( cursor, """ALTER TABLE referral_bindings MODIFY COLUMN status ENUM('active', 'converted', 'expired', 'cancelled') DEFAULT 'active' COMMENT 'Binding status'""", "Update status enum type" ) print() # 提交更改 conn.commit() # 4. 验证字段 print("Step 4: Verifying migration") print("-"*60) cursor.execute("SHOW COLUMNS FROM referral_bindings") columns = cursor.fetchall() required_fields = ['last_purchase_date', 'purchase_count', 'total_commission'] found_fields = [col[0] for col in columns] for field in required_fields: if field in found_fields: print(f"[OK] Field {field} exists") else: print(f"[ERROR] Field {field} not found") print() # 5. 显示索引 print("Step 5: Current indexes") print("-"*60) cursor.execute("SHOW INDEX FROM referral_bindings") indexes = cursor.fetchall() index_names = set() for idx in indexes: if idx[2] not in index_names: print(f" - {idx[2]} ({idx[4]})") index_names.add(idx[2]) print() # 关闭连接 cursor.close() conn.close() print("="*60) print("[OK] Migration completed!") print("="*60) if __name__ == "__main__": main()