Files
soul-yongping/scripts/migrate_binding_fields.py

163 lines
4.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
数据库迁移脚本:为 referral_bindings 表添加新字段
用于支持新的分销逻辑(立即切换绑定、购买累加)
"""
import os
import sys
import pymysql
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
# 数据库配置
DB_CONFIG = {
'host': os.getenv('DB_HOST', 'localhost'),
'port': int(os.getenv('DB_PORT', 3306)),
'user': os.getenv('DB_USER', 'root'),
'password': os.getenv('DB_PASSWORD', ''),
'database': os.getenv('DB_NAME', 'mycontent_db'),
'charset': 'utf8mb4'
}
def execute_sql(cursor, sql, description):
"""执行SQL并打印结果"""
try:
cursor.execute(sql)
print(f"{description}")
return True
except pymysql.err.OperationalError as e:
if 'Duplicate' in str(e) or 'already exists' in str(e):
print(f"⚠️ {description} (已存在,跳过)")
return True
else:
print(f"{description} 失败: {e}")
return False
except Exception as e:
print(f"{description} 失败: {e}")
return False
def main():
print("=" * 60)
print("数据库迁移referral_bindings 表字段升级")
print("=" * 60)
print()
# 连接数据库
try:
conn = pymysql.connect(**DB_CONFIG)
cursor = conn.cursor()
print(f"✅ 已连接到数据库: {DB_CONFIG['database']}")
print()
except Exception as e:
print(f"❌ 数据库连接失败: {e}")
sys.exit(1)
# 1. 添加新字段
print("步骤 1: 添加新字段")
print("-" * 60)
execute_sql(
cursor,
"""ALTER TABLE referral_bindings
ADD COLUMN last_purchase_date DATETIME NULL COMMENT '最后一次购买时间'""",
"添加字段 last_purchase_date"
)
execute_sql(
cursor,
"""ALTER TABLE referral_bindings
ADD COLUMN purchase_count INT DEFAULT 0 COMMENT '购买次数'""",
"添加字段 purchase_count"
)
execute_sql(
cursor,
"""ALTER TABLE referral_bindings
ADD COLUMN total_commission DECIMAL(10,2) DEFAULT 0.00 COMMENT '累计佣金'""",
"添加字段 total_commission"
)
print()
# 2. 添加索引
print("步骤 2: 添加索引")
print("-" * 60)
execute_sql(
cursor,
"""ALTER TABLE referral_bindings
ADD INDEX idx_referee_status (referee_id, status)""",
"添加索引 idx_referee_status"
)
execute_sql(
cursor,
"""ALTER TABLE referral_bindings
ADD INDEX idx_expiry_purchase (expiry_date, purchase_count, status)""",
"添加索引 idx_expiry_purchase"
)
print()
# 3. 修改 status 枚举
print("步骤 3: 更新 status 枚举(添加 cancelled")
print("-" * 60)
execute_sql(
cursor,
"""ALTER TABLE referral_bindings
MODIFY COLUMN status ENUM('active', 'converted', 'expired', 'cancelled')
DEFAULT 'active' COMMENT '绑定状态'""",
"更新 status 枚举类型"
)
print()
# 提交更改
conn.commit()
# 4. 验证字段
print("步骤 4: 验证迁移结果")
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"✅ 字段 {field} 已存在")
else:
print(f"❌ 字段 {field} 未找到")
print()
# 5. 显示索引
print("步骤 5: 当前索引列表")
print("-" * 60)
cursor.execute("SHOW INDEX FROM referral_bindings")
indexes = cursor.fetchall()
for idx in indexes:
print(f" - {idx[2]} ({idx[4]})")
print()
# 关闭连接
cursor.close()
conn.close()
print("=" * 60)
print("✅ 迁移完成!")
print("=" * 60)
if __name__ == "__main__":
main()