本文目录导读:

我来详细介绍如何实现一个维护更新标签体系的脚本,这里提供几种常见方案:
基础标签体系维护脚本(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
最佳实践建议
- 版本控制:每次更新都记录变更历史
- 增量更新:支持部分更新而非全量替换
- 权限控制:记录修改人信息
- 原子操作:确保批量操作的原子性
- 备份恢复:定期备份,支持回滚
- 监控告警:发现异常变更及时告警
这个标签体系维护脚本可以根据实际业务需求进行扩展,比如支持标签层级关系、标签权重、自动关联等高级功能。