132 lines
4.7 KiB
Python
132 lines
4.7 KiB
Python
#!/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())
|