怎样实现维护更新标签体系脚本

wen 实用脚本 33

本文目录导读:

怎样实现维护更新标签体系脚本

  1. 基础标签体系维护脚本(Python示例)
  2. 命令行脚本版本
  3. 数据库版标签维护(SQL + Python)
  4. 批量更新脚本(YAML配置驱动)
  5. 自动化维护建议
  6. 使用示例
  7. 最佳实践建议

我来详细介绍如何实现一个维护更新标签体系的脚本,这里提供几种常见方案:

基础标签体系维护脚本(Python示例)

#!/usr/bin/env python3
"""
标签体系维护脚本
支持:增删改查、批量更新、版本管理
"""
import json
import datetime
import logging
from typing import Dict, List, Optional
from pathlib import Path
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class TagManager:
    """标签体系管理器"""
    def __init__(self, tag_file: str = "tags.json"):
        self.tag_file = tag_file
        self.tags = self._load_tags()
    def _load_tags(self) -> Dict:
        """加载标签数据"""
        try:
            if Path(self.tag_file).exists():
                with open(self.tag_file, 'r', encoding='utf-8') as f:
                    return json.load(f)
            return {"version": "1.0", "tags": [], "updated_at": None}
        except Exception as e:
            logger.error(f"加载标签失败: {e}")
            return {"version": "1.0", "tags": [], "updated_at": None}
    def _save_tags(self):
        """保存标签数据"""
        try:
            self.tags["updated_at"] = datetime.datetime.now().isoformat()
            with open(self.tag_file, 'w', encoding='utf-8') as f:
                json.dump(self.tags, f, ensure_ascii=False, indent=2)
            logger.info("标签数据已保存")
        except Exception as e:
            logger.error(f"保存标签失败: {e}")
    def add_tag(self, name: str, category: str, description: str = "") -> bool:
        """添加新标签"""
        # 检查标签是否已存在
        if any(tag["name"] == name for tag in self.tags["tags"]):
            logger.warning(f"标签 '{name}' 已存在")
            return False
        new_tag = {
            "name": name,
            "category": category,
            "description": description,
            "created_at": datetime.datetime.now().isoformat(),
            "status": "active"
        }
        self.tags["tags"].append(new_tag)
        self._save_tags()
        logger.info(f"新增标签: {name}")
        return True
    def update_tag(self, name: str, **kwargs) -> bool:
        """更新标签属性"""
        for tag in self.tags["tags"]:
            if tag["name"] == name:
                for key, value in kwargs.items():
                    if key in tag:
                        tag[key] = value
                tag["updated_at"] = datetime.datetime.now().isoformat()
                self._save_tags()
                logger.info(f"更新标签: {name}")
                return True
        logger.warning(f"标签 '{name}' 不存在")
        return False
    def delete_tag(self, name: str) -> bool:
        """删除标签(软删除)"""
        for tag in self.tags["tags"]:
            if tag["name"] == name:
                tag["status"] = "deleted"
                tag["deleted_at"] = datetime.datetime.now().isoformat()
                self._save_tags()
                logger.info(f"删除标签: {name}")
                return True
        logger.warning(f"标签 '{name}' 不存在")
        return False
    def get_tags_by_category(self, category: str) -> List[Dict]:
        """按分类获取标签"""
        return [tag for tag in self.tags["tags"] 
                if tag["category"] == category and tag["status"] == "active"]
    def batch_import(self, tags_data: List[Dict]) -> Dict[str, int]:
        """批量导入标签"""
        stats = {"success": 0, "failed": 0, "duplicated": 0}
        for tag in tags_data:
            if self.add_tag(tag.get("name"), tag.get("category"), tag.get("description", "")):
                stats["success"] += 1
            else:
                if any(t["name"] == tag.get("name") for t in self.tags["tags"]):
                    stats["duplicated"] += 1
                else:
                    stats["failed"] += 1
        return stats
    def export_tags(self, output_file: str = "tags_export.json"):
        """导出标签体系"""
        try:
            with open(output_file, 'w', encoding='utf-8') as f:
                json.dump(self.tags, f, ensure_ascii=False, indent=2)
            logger.info(f"标签已导出到: {output_file}")
        except Exception as e:
            logger.error(f"导出失败: {e}")

命令行脚本版本

#!/usr/bin/env python3
"""
标签体系维护命令行工具
"""
import sys
import argparse
from tag_manager import TagManager
def main():
    parser = argparse.ArgumentParser(description='标签体系维护工具')
    parser.add_argument('action', choices=['add', 'update', 'delete', 'list', 'import', 'export'])
    parser.add_argument('--name', help='标签名称')
    parser.add_argument('--category', help='标签分类')
    parser.add_argument('--desc', help='标签描述')
    parser.add_argument('--status', help='标签状态', choices=['active', 'inactive', 'deleted'])
    parser.add_argument('--file', help='导入/导出文件路径')
    args = parser.parse_args()
    manager = TagManager()
    if args.action == 'add':
        if not args.name or not args.category:
            print("错误: 添加标签需要 --name 和 --category 参数")
            sys.exit(1)
        manager.add_tag(args.name, args.category, args.desc or "")
    elif args.action == 'update':
        if not args.name:
            print("错误: 更新标签需要 --name 参数")
            sys.exit(1)
        kwargs = {}
        if args.category: kwargs['category'] = args.category
        if args.desc: kwargs['description'] = args.desc
        if args.status: kwargs['status'] = args.status
        manager.update_tag(args.name, **kwargs)
    elif args.action == 'delete':
        if not args.name:
            print("错误: 删除标签需要 --name 参数")
            sys.exit(1)
        manager.delete_tag(args.name)
    elif args.action == 'list':
        if args.category:
            tags = manager.get_tags_by_category(args.category)
            print(f"分类 '{args.category}' 下的标签:")
        else:
            tags = [tag for tag in manager.tags['tags'] if tag['status'] == 'active']
            print("所有活跃标签:")
        for tag in tags:
            print(f"  - {tag['name']} ({tag['category']}): {tag.get('description', '')}")
    elif args.action == 'import':
        if not args.file:
            print("错误: 导入需要 --file 参数")
            sys.exit(1)
        try:
            with open(args.file, 'r', encoding='utf-8') as f:
                tags_data = json.load(f)
            stats = manager.batch_import(tags_data)
            print(f"导入完成: 成功 {stats['success']}, 重复 {stats['duplicated']}, 失败 {stats['failed']}")
        except Exception as e:
            print(f"导入失败: {e}")
    elif args.action == 'export':
        manager.export_tags(args.file or "tags_export.json")
if __name__ == "__main__":
    main()

数据库版标签维护(SQL + Python)

#!/usr/bin/env python3
"""
数据库版标签体系维护脚本
支持 MySQL/PostgreSQL
"""
import psycopg2
from typing import Dict, List, Optional
import datetime
class DatabaseTagManager:
    """数据库标签管理"""
    def __init__(self, db_config: Dict):
        self.conn = psycopg2.connect(**db_config)
        self._init_tables()
    def _init_tables(self):
        """初始化标签表"""
        with self.conn.cursor() as cur:
            cur.execute("""
                CREATE TABLE IF NOT EXISTS tag_categories (
                    id SERIAL PRIMARY KEY,
                    name VARCHAR(100) UNIQUE NOT NULL,
                    description TEXT,
                    parent_id INTEGER REFERENCES tag_categories(id),
                    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
                );
                CREATE TABLE IF NOT EXISTS tags (
                    id SERIAL PRIMARY KEY,
                    name VARCHAR(100) NOT NULL,
                    category_id INTEGER REFERENCES tag_categories(id),
                    description TEXT,
                    version INTEGER DEFAULT 1,
                    status VARCHAR(20) DEFAULT 'active',
                    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                    UNIQUE(name, category_id)
                );
                CREATE TABLE IF NOT EXISTS tag_version_history (
                    id SERIAL PRIMARY KEY,
                    tag_id INTEGER REFERENCES tags(id),
                    old_value JSONB,
                    new_value JSONB,
                    changed_by VARCHAR(100),
                    changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
                );
            """)
            self.conn.commit()
    def add_tag_with_version(self, name: str, category: str, 
                             description: str = "", user: str = "system"):
        """新增标签并记录版本"""
        with self.conn.cursor() as cur:
            # 获取或创建分类
            cur.execute("""
                INSERT INTO tag_categories (name) 
                VALUES (%s) 
                ON CONFLICT (name) DO UPDATE SET name = EXCLUDED.name
                RETURNING id
            """, (category,))
            category_id = cur.fetchone()[0]
            # 创建标签
            cur.execute("""
                INSERT INTO tags (name, category_id, description)
                VALUES (%s, %s, %s)
                RETURNING id, version
            """, (name, category_id, description))
            tag_id, version = cur.fetchone()
            # 记录版本历史
            cur.execute("""
                INSERT INTO tag_version_history (tag_id, new_value, changed_by)
                VALUES (%s, %s::jsonb, %s)
            """, (tag_id, json.dumps({
                "name": name, 
                "category": category, 
                "description": description
            }), user))
            self.conn.commit()
            return {"id": tag_id, "version": version}

批量更新脚本(YAML配置驱动)

# tags_update_config.yaml
updates:
  - action: add
    tags:
      - name: "人工智能"
        category: "技术"
        description: "AI相关标签"
        children:
          - name: "机器学习"
            category: "技术"
          - name: "深度学习"
            category: "技术"
  - action: update
    tags:
      - name: "大数据"
        new_category: "技术"
        new_description: "数据分析与处理"
  - action: merge
    source: "旧标签A"
    target: "新标签B"
  - action: archive
    tags: ["过时标签1", "过时标签2"]
#!/usr/bin/env python3
"""YAML驱动的标签批量更新脚本"""
import yaml
from tag_manager import TagManager
class BatchTagUpdater:
    def __init__(self, config_file: str):
        with open(config_file, 'r', encoding='utf-8') as f:
            self.config = yaml.safe_load(f)
        self.manager = TagManager()
    def execute(self):
        """执行批量更新"""
        for update in self.config.get('updates', []):
            action = update.get('action')
            if action == 'add':
                self._batch_add(update.get('tags', []))
            elif action == 'update':
                self._batch_update(update.get('tags', []))
            elif action == 'merge':
                self._merge_tags(update.get('source'), update.get('target'))
            elif action == 'archive':
                self._archive_tags(update.get('tags', []))
    def _batch_add(self, tags):
        for tag in tags:
            self.manager.add_tag(
                tag['name'], 
                tag.get('category', '默认'),
                tag.get('description', '')
            )
            # 递归添加子标签
            if 'children' in tag:
                self._batch_add(tag['children'])
if __name__ == "__main__":
    updater = BatchTagUpdater("tags_update_config.yaml")
    updater.execute()

自动化维护建议

定时检查脚本

#!/usr/bin/env python3
"""定时标签维护检查"""
import schedule
import time
def check_tag_health():
    """检查标签健康状态"""
    manager = TagManager()
    # 检查孤儿标签(无分类)
    orphan_tags = [t for t in manager.tags['tags'] 
                   if t['status'] == 'active' and not t.get('category')]
    # 检查重复标签
    tag_names = [t['name'] for t in manager.tags['tags']]
    duplicates = [name for name in tag_names if tag_names.count(name) > 1]
    if orphan_tags:
        logger.warning(f"发现 {len(orphan_tags)} 个孤儿标签")
    if duplicates:
        logger.warning(f"发现重复标签: {set(duplicates)}")
    # 清理过期标签(7天前标记为删除的)
    cleanup_time = datetime.datetime.now() - datetime.timedelta(days=7)
    for tag in manager.tags['tags']:
        if tag.get('status') == 'deleted' and tag.get('deleted_at'):
            if tag['deleted_at'] < cleanup_time.isoformat():
                manager.tags['tags'].remove(tag)
    manager._save_tags()
# 每天凌晨2点执行
schedule.every().day.at("02:00").do(check_tag_health)
while True:
    schedule.run_pending()
    time.sleep(60)

使用示例

# 添加标签
python tag_cli.py add --name "机器学习" --category "技术" --desc "ML相关标签"
# 更新标签
python tag_cli.py update --name "机器学习" --desc "更新描述"
# 批量导入
python tag_cli.py import --file new_tags.json
# 导出所有标签
python tag_cli.py export --file backup.json
# 列出所有标签
python tag_cli.py list

最佳实践建议

  1. 版本控制:每次更新都记录变更历史
  2. 增量更新:支持部分更新而非全量替换
  3. 权限控制:记录修改人信息
  4. 原子操作:确保批量操作的原子性
  5. 备份恢复:定期备份,支持回滚
  6. 监控告警:发现异常变更及时告警

这个标签体系维护脚本可以根据实际业务需求进行扩展,比如支持标签层级关系、标签权重、自动关联等高级功能。

抱歉,评论功能暂时关闭!