101 lines
3.5 KiB
Python
101 lines
3.5 KiB
Python
|
|
#!/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=7,is_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("数据库结构修改失败")
|