106 lines
3.8 KiB
Python
Executable File
106 lines
3.8 KiB
Python
Executable File
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
|
||
import os
|
||
import sqlite3
|
||
import sys
|
||
|
||
# 数据库路径
|
||
db_path = '/root/autodl-tmp/TravelContentCreator/distribution.db'
|
||
|
||
def main():
|
||
print(f"开始修复数据库: {db_path}")
|
||
|
||
# 连接数据库
|
||
try:
|
||
conn = sqlite3.connect(db_path)
|
||
conn.execute("PRAGMA foreign_keys = OFF") # 禁用外键约束
|
||
cursor = conn.cursor()
|
||
print(f"已连接到数据库")
|
||
|
||
# 备份用户数据
|
||
print("正在备份用户数据...")
|
||
users_data = []
|
||
try:
|
||
cursor.execute("SELECT id, email, username, created_at FROM users")
|
||
users_data = cursor.fetchall()
|
||
print(f"成功备份 {len(users_data)} 条用户记录")
|
||
except sqlite3.Error as e:
|
||
print(f"备份用户数据时出错: {e}")
|
||
print("继续执行修复操作...")
|
||
|
||
# 检查数据库表结构
|
||
print("检查数据库表结构...")
|
||
try:
|
||
cursor.execute("PRAGMA table_info(users)")
|
||
columns = {col[1] for col in cursor.fetchall()}
|
||
|
||
# 打印当前表结构
|
||
print(f"当前用户表字段: {', '.join(columns)}")
|
||
|
||
# 创建新的用户表
|
||
print("创建新的用户表结构...")
|
||
cursor.execute("""
|
||
CREATE TABLE IF NOT EXISTS users_new (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
email TEXT NOT NULL,
|
||
username TEXT,
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
xhs_user_id TEXT UNIQUE
|
||
)
|
||
""")
|
||
|
||
# 复制用户数据到新表
|
||
if users_data:
|
||
print("将数据迁移到新表...")
|
||
for user in users_data:
|
||
user_id, email, username, created_at = user
|
||
# 使用email作为临时xhs_user_id,稍后可以更新
|
||
cursor.execute("""
|
||
INSERT INTO users_new (id, email, username, created_at, xhs_user_id)
|
||
VALUES (?, ?, ?, ?, NULL)
|
||
""", (user_id, email, username, created_at))
|
||
print(f"已将 {len(users_data)} 条记录迁移到新表")
|
||
|
||
# 查询是否存在users表,如果存在就删除
|
||
cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='users'")
|
||
if cursor.fetchone():
|
||
cursor.execute("DROP TABLE users")
|
||
print("已删除旧的users表")
|
||
|
||
# 重命名新表
|
||
cursor.execute("ALTER TABLE users_new RENAME TO users")
|
||
print("已将新表重命名为users")
|
||
|
||
# 为邮箱创建非唯一索引
|
||
cursor.execute("CREATE INDEX IF NOT EXISTS idx_users_email ON users(email)")
|
||
print("已为email字段创建索引")
|
||
|
||
# 为xhs_user_id创建唯一索引
|
||
cursor.execute("CREATE UNIQUE INDEX IF NOT EXISTS idx_users_xhs_id ON users(xhs_user_id) WHERE xhs_user_id IS NOT NULL")
|
||
print("已为xhs_user_id字段创建唯一索引")
|
||
|
||
# 提交事务
|
||
conn.commit()
|
||
print("数据库结构修复完成!")
|
||
|
||
except sqlite3.Error as e:
|
||
print(f"修复表结构时出错: {e}")
|
||
conn.rollback()
|
||
return False
|
||
|
||
except sqlite3.Error as e:
|
||
print(f"数据库连接错误: {e}")
|
||
return False
|
||
finally:
|
||
print("关闭数据库连接")
|
||
conn.close()
|
||
|
||
return True
|
||
|
||
if __name__ == "__main__":
|
||
if main():
|
||
print("数据库修复成功!")
|
||
else:
|
||
print("数据库修复失败!")
|
||
sys.exit(1) |