init-db.sh 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  4. FORGE_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
  5. HOST="127.0.0.1"
  6. PORT="3306"
  7. DATABASE="forge_admin"
  8. USER="root"
  9. PASSWORD=""
  10. WITH_DEMO="false"
  11. WITH_OPTIONAL="false"
  12. WITH_MODULE="false"
  13. SKIP_ADMIN_INIT="false"
  14. usage() {
  15. cat <<'USAGE'
  16. Usage: init-db.sh [options]
  17. Options:
  18. --host HOST MySQL host, default 127.0.0.1
  19. --port PORT MySQL port, default 3306
  20. --database DATABASE Database name, default forge_admin
  21. --user USER MySQL user, default root
  22. --password PASSWORD MySQL password
  23. --with-demo Import demo seed data
  24. --with-optional Import optional seed data
  25. --with-module Import module SQL from db/module
  26. --skip-admin-init Skip forge-admin-server/sql/初始化脚本.sql
  27. USAGE
  28. }
  29. while [[ $# -gt 0 ]]; do
  30. case "$1" in
  31. --host)
  32. HOST="$2"
  33. shift 2
  34. ;;
  35. --port)
  36. PORT="$2"
  37. shift 2
  38. ;;
  39. --database)
  40. DATABASE="$2"
  41. shift 2
  42. ;;
  43. --user)
  44. USER="$2"
  45. shift 2
  46. ;;
  47. --password)
  48. PASSWORD="$2"
  49. shift 2
  50. ;;
  51. --with-demo)
  52. WITH_DEMO="true"
  53. shift
  54. ;;
  55. --with-optional)
  56. WITH_OPTIONAL="true"
  57. shift
  58. ;;
  59. --with-module)
  60. WITH_MODULE="true"
  61. shift
  62. ;;
  63. --skip-admin-init)
  64. SKIP_ADMIN_INIT="true"
  65. shift
  66. ;;
  67. -h|--help)
  68. usage
  69. exit 0
  70. ;;
  71. *)
  72. echo "Unknown argument: $1" >&2
  73. usage
  74. exit 1
  75. ;;
  76. esac
  77. done
  78. if ! command -v mysql >/dev/null 2>&1; then
  79. echo "mysql client is required. Install MySQL client and retry." >&2
  80. exit 1
  81. fi
  82. MYSQL=(mysql --host="$HOST" --port="$PORT" --user="$USER")
  83. if [[ -n "$PASSWORD" ]]; then
  84. MYSQL+=(--password="$PASSWORD")
  85. fi
  86. "${MYSQL[@]}" --execute="CREATE DATABASE IF NOT EXISTS \`$DATABASE\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
  87. MYSQL_DB=("${MYSQL[@]}" "$DATABASE")
  88. run_sql_file() {
  89. local file="$1"
  90. if [[ -s "$file" ]]; then
  91. echo "Running $file"
  92. "${MYSQL_DB[@]}" < "$file"
  93. fi
  94. }
  95. run_sql_dir() {
  96. local dir="$1"
  97. if [[ -d "$dir" ]]; then
  98. find "$dir" -maxdepth 1 -type f -name '*.sql' | sort | while IFS= read -r file; do
  99. run_sql_file "$file"
  100. done
  101. fi
  102. }
  103. if [[ "$SKIP_ADMIN_INIT" != "true" ]]; then
  104. run_sql_file "$FORGE_DIR/db/全量初始化SQL.sql"
  105. fi
  106. run_sql_dir "$FORGE_DIR/db/seed/required"
  107. if [[ "$WITH_MODULE" == "true" ]]; then
  108. run_sql_dir "$FORGE_DIR/db/module"
  109. fi
  110. if [[ "$WITH_DEMO" == "true" ]]; then
  111. run_sql_dir "$FORGE_DIR/db/seed/demo"
  112. fi
  113. if [[ "$WITH_OPTIONAL" == "true" ]]; then
  114. run_sql_dir "$FORGE_DIR/db/seed/optional"
  115. fi
  116. echo "Database initialization completed for $DATABASE."