本文目录导读:

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