74 lines
2.2 KiB
Python
74 lines
2.2 KiB
Python
|
|
"""修复空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()
|