Files
tophux_scrape/modify_db_to_score.py

101 lines
3.5 KiB
Python
Raw Permalink Normal View History

#!/usr/bin/env python3
"""
修改数据库结构脚本
将is_interested字段改为score字段实现10分评分制度
"""
import sqlite3
import os
from loguru import logger
def modify_database_structure():
"""修改数据库结构将is_interested字段改为score字段"""
# 获取当前脚本所在目录的数据库文件路径
script_dir = os.path.dirname(os.path.abspath(__file__))
db_path = os.path.join(script_dir, "tophub_data.db")
# 检查数据库文件是否存在
if not os.path.exists(db_path):
logger.error(f"数据库文件不存在: {db_path}")
return False
try:
# 连接数据库
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# 检查is_interested字段是否存在
cursor.execute("PRAGMA table_info(articles)")
columns = cursor.fetchall()
column_names = [column[1] for column in columns]
if "is_interested" not in column_names:
logger.info("is_interested字段不存在无需修改")
conn.close()
return True
# 检查score字段是否已存在
if "score" in column_names:
logger.info("score字段已存在无需添加")
conn.close()
return True
# 添加score字段默认值为5
logger.info("正在添加score字段...")
cursor.execute("ALTER TABLE articles ADD COLUMN score INTEGER DEFAULT 5")
# 将is_interested的值转换为score
logger.info("正在转换is_interested数据到score字段...")
# 获取所有记录
cursor.execute("SELECT id, is_interested FROM articles")
records = cursor.fetchall()
# 转换数据
for record in records:
article_id, is_interested = record
# 转换逻辑is_interested=1转为score=7is_interested=0转为score=5
score = 7 if is_interested == 1 else 5
cursor.execute("UPDATE articles SET score = ? WHERE id = ?", (score, article_id))
# 提交更改
conn.commit()
logger.info("成功添加score字段并转换数据")
# 验证字段是否添加成功
cursor.execute("PRAGMA table_info(articles)")
columns = cursor.fetchall()
column_names = [column[1] for column in columns]
if "score" in column_names:
logger.info("验证成功score字段已添加到articles表")
else:
logger.error("验证失败score字段未成功添加")
conn.close()
return False
# 检查数据转换结果
cursor.execute("SELECT COUNT(*) FROM articles WHERE score = 7")
count_7 = cursor.fetchone()[0]
cursor.execute("SELECT COUNT(*) FROM articles WHERE score = 5")
count_5 = cursor.fetchone()[0]
logger.info(f"数据转换结果: score=7的记录数: {count_7}, score=5的记录数: {count_5}")
conn.close()
return True
except sqlite3.Error as e:
logger.error(f"数据库操作出错: {str(e)}")
return False
except Exception as e:
logger.error(f"修改数据库结构时出错: {str(e)}")
return False
if __name__ == "__main__":
logger.add("db_modify_score.log", rotation="10 MB", level="INFO")
if modify_database_structure():
logger.info("数据库结构修改完成")
else:
logger.error("数据库结构修改失败")