init_db.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #!/usr/bin/env python
  2. """
  3. 数据库初始化脚本
  4. 功能:
  5. - 创建所有数据库表
  6. - 创建默认管理员账户
  7. - 可选: 创建示例数据
  8. 用法:
  9. python init_db.py # 初始化数据库并创建管理员
  10. python init_db.py --with-demo # 初始化并创建示例数据
  11. python init_db.py --reset # 重置数据库(删除所有数据后重新初始化)
  12. """
  13. import os
  14. import sys
  15. import argparse
  16. # 添加项目根目录到路径
  17. sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
  18. from app import create_app, db
  19. from app.models import User, AWSCredential, UserCredential, Task, TaskLog, Report
  20. def init_database(reset=False):
  21. """初始化数据库表"""
  22. if reset:
  23. print("⚠️ 正在删除所有表...")
  24. db.drop_all()
  25. print("✓ 所有表已删除")
  26. print("正在创建数据库表...")
  27. db.create_all()
  28. print("✓ 数据库表创建完成")
  29. def create_admin_user():
  30. """创建默认管理员账户"""
  31. admin = User.query.filter_by(username='admin').first()
  32. if admin:
  33. print("✓ 管理员账户已存在,跳过创建")
  34. return admin
  35. admin = User(
  36. username='admin',
  37. email='admin@example.com',
  38. role='admin',
  39. is_active=True
  40. )
  41. admin.set_password('admin123')
  42. db.session.add(admin)
  43. db.session.commit()
  44. print("✓ 管理员账户创建成功")
  45. print(" 用户名: admin")
  46. print(" 密码: admin123")
  47. print(" ⚠️ 请在生产环境中修改默认密码!")
  48. return admin
  49. def create_demo_data(admin_user):
  50. """创建示例数据"""
  51. print("\n正在创建示例数据...")
  52. # 创建示例用户
  53. demo_user = User.query.filter_by(username='demo').first()
  54. if not demo_user:
  55. demo_user = User(
  56. username='demo',
  57. email='demo@example.com',
  58. role='user',
  59. is_active=True
  60. )
  61. demo_user.set_password('demo123')
  62. db.session.add(demo_user)
  63. print("✓ 示例用户创建成功 (demo/demo123)")
  64. # 创建示例 AWS 凭证 (Assume Role 类型)
  65. demo_credential = AWSCredential.query.filter_by(name='Demo Account').first()
  66. if not demo_credential:
  67. demo_credential = AWSCredential(
  68. name='Demo Account',
  69. credential_type='assume_role',
  70. account_id='123456789012',
  71. role_arn='arn:aws:iam::123456789012:role/DemoRole',
  72. external_id='demo-external-id',
  73. is_active=True
  74. )
  75. db.session.add(demo_credential)
  76. print("✓ 示例 AWS 凭证创建成功")
  77. db.session.commit()
  78. # 关联凭证到管理员
  79. user_cred = UserCredential.query.filter_by(
  80. user_id=admin_user.id,
  81. credential_id=demo_credential.id
  82. ).first()
  83. if not user_cred:
  84. user_cred = UserCredential(
  85. user_id=admin_user.id,
  86. credential_id=demo_credential.id
  87. )
  88. db.session.add(user_cred)
  89. db.session.commit()
  90. print("✓ 凭证已关联到管理员账户")
  91. print("✓ 示例数据创建完成")
  92. def main():
  93. parser = argparse.ArgumentParser(description='数据库初始化脚本')
  94. parser.add_argument('--with-demo', action='store_true', help='创建示例数据')
  95. parser.add_argument('--reset', action='store_true', help='重置数据库(删除所有数据)')
  96. parser.add_argument('--env', default='development', help='运行环境 (development/testing/production)')
  97. args = parser.parse_args()
  98. if args.reset:
  99. confirm = input("⚠️ 确定要删除所有数据吗? 输入 'yes' 确认: ")
  100. if confirm.lower() != 'yes':
  101. print("操作已取消")
  102. return
  103. print(f"\n{'='*50}")
  104. print(f"数据库初始化 - 环境: {args.env}")
  105. print(f"{'='*50}\n")
  106. # 创建应用上下文
  107. app = create_app(args.env)
  108. with app.app_context():
  109. # 初始化数据库
  110. init_database(reset=args.reset)
  111. # 创建管理员
  112. admin = create_admin_user()
  113. # 创建示例数据
  114. if args.with_demo:
  115. create_demo_data(admin)
  116. print(f"\n{'='*50}")
  117. print("✓ 数据库初始化完成!")
  118. print(f"{'='*50}\n")
  119. if __name__ == '__main__':
  120. main()