"""修复空slug的迁移脚本""" import sys import os import re # 添加项目根目录到系统路径 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from app import create_app from models import db, Site from datetime import datetime from pypinyin import lazy_pinyin # 创建应用上下文 app = create_app() def generate_slug(name, site_id=None): """从名称生成slug""" # 将中文转换为拼音 slug = ''.join(lazy_pinyin(name)) # 转换为小写,移除特殊字符 slug = slug.lower() slug = re.sub(r'[^\w\s-]', '', slug) slug = re.sub(r'[-\s]+', '-', slug).strip('-') # 如果转换后为空,使用ID或时间戳 if not slug: if site_id: slug = f"site-{site_id}" else: slug = f"site-{datetime.now().strftime('%Y%m%d%H%M%S')}" # 确保slug唯一 base_slug = slug counter = 1 while Site.query.filter(Site.slug == slug, Site.id != site_id).first(): slug = f"{base_slug}-{counter}" counter += 1 return slug with app.app_context(): try: # 查找所有slug为空或包含乱码的网站 all_sites = Site.query.all() sites_to_fix = [] for site in all_sites: # 检查slug是否为空、None、或包含乱码 if (not site.slug or site.slug == 'None' or site.slug.strip() == '' or any(ord(char) > 127 and not char.isalpha() for char in site.slug)): sites_to_fix.append(site) if not sites_to_fix: print("No sites to fix. All good!") else: print(f"Found {len(sites_to_fix)} sites to fix...") for site in sites_to_fix: old_slug = site.slug site.slug = generate_slug(site.name, site.id) print(f" - Site #{site.id} '{site.name}': '{old_slug}' -> '{site.slug}'") db.session.commit() print(f"Successfully fixed {len(sites_to_fix)} sites!") except Exception as e: print(f"Migration failed: {str(e)}") import traceback traceback.print_exc() db.session.rollback()