Kamixitong/quick_fix.py

132 lines
4.7 KiB
Python
Raw Normal View History

2025-11-11 21:39:12 +08:00
#!/usr/bin/env python3
"""
快速修复脚本 - 修复数据库字段缺失问题
使用方法:
1. 确保config.py中数据库配置正确
2. 运行: python quick_fix.py
"""
import os
import sys
# 添加项目路径
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from app import create_app, db
from app.models import Admin, AuditLog
def fix_database():
"""修复数据库结构"""
app = create_app()
with app.app_context():
print("=" * 60)
print("开始修复数据库...")
print("=" * 60)
try:
# 检查admin表结构
print("\n1. 检查admin表字段...")
admin_columns = [c.name for c in Admin.__table__.columns]
print(f" 当前字段: {', '.join(admin_columns)}")
# 检查is_deleted字段
if 'is_deleted' not in admin_columns:
print(" ⚠️ 缺少 is_deleted 字段,正在添加...")
db.session.execute("ALTER TABLE admin ADD COLUMN is_deleted INT NOT NULL DEFAULT 0")
db.session.execute("ALTER TABLE admin ADD COLUMN delete_time DATETIME NULL")
db.session.execute("CREATE INDEX ix_admin_is_deleted ON admin(is_deleted)")
db.session.commit()
print(" ✅ 已添加 is_deleted 和 delete_time 字段")
else:
print(" ✅ is_deleted 字段已存在")
# 检查delete_time字段
if 'delete_time' not in admin_columns:
print(" ⚠️ 缺少 delete_time 字段,正在添加...")
db.session.execute("ALTER TABLE admin ADD COLUMN delete_time DATETIME NULL")
db.session.commit()
print(" ✅ 已添加 delete_time 字段")
else:
print(" ✅ delete_time 字段已存在")
# 检查audit_log表
print("\n2. 检查audit_log表...")
try:
AuditLog.query.count()
print(" ✅ audit_log 表存在")
except Exception as e:
print(f" ⚠️ audit_log 表不存在或有问题: {e}")
print(" 正在创建...")
db.session.execute("""
CREATE TABLE audit_log (
log_id INT AUTO_INCREMENT PRIMARY KEY,
admin_id INT NOT NULL,
action VARCHAR(32) NOT NULL,
target_type VARCHAR(32) NOT NULL,
target_id INT NULL,
details TEXT NULL,
ip_address VARCHAR(32) NULL,
user_agent VARCHAR(256) NULL,
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (admin_id) REFERENCES admin(admin_id)
)
""")
db.session.execute("CREATE INDEX ix_audit_log_admin_id ON audit_log(admin_id)")
db.session.execute("CREATE INDEX ix_audit_log_action ON audit_log(action)")
db.session.execute("CREATE INDEX ix_audit_log_create_time ON audit_log(create_time)")
db.session.commit()
print(" ✅ audit_log 表创建成功")
# 验证修复
print("\n3. 验证修复结果...")
admin_columns = [c.name for c in Admin.__table__.columns]
assert 'is_deleted' in admin_columns, "is_deleted 字段缺失"
assert 'delete_time' in admin_columns, "delete_time 字段缺失"
print(" ✅ admin 表结构正确")
audit_columns = [c.name for c in AuditLog.__table__.columns]
print(" ✅ audit_log 表存在")
print("\n" + "=" * 60)
print("✅ 数据库修复完成!")
print("=" * 60)
return True
except Exception as e:
db.session.rollback()
print("\n" + "=" * 60)
print("❌ 修复失败!")
print(f"错误: {str(e)}")
print("=" * 60)
import traceback
traceback.print_exc()
return False
def main():
"""主函数"""
print("\n" + "=" * 60)
print("数据库快速修复工具")
print("=" * 60 + "\n")
# 检查config.py
if not os.path.exists('config.py'):
print("⚠️ 未找到 config.py 文件")
print("请确保在项目根目录运行此脚本\n")
# 修复数据库
success = fix_database()
if success:
print("\n✅ 可以启动应用了!")
print("运行: python run.py\n")
return 0
else:
print("\n❌ 修复失败,请检查错误信息\n")
return 1
if __name__ == '__main__':
sys.exit(main())