merge_database_simple.sh 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #!/bin/bash
  2. # 数据库代码拼接脚本
  3. # 功能:将 output_sourcecode/db/ 目录下的SQL文件拼接成软著申请材料
  4. #
  5. # 主要处理文件类型:
  6. # - SQL表结构文件 (.sql)
  7. # - 数据定义文件 (.ddl)
  8. # - 数据库架构文件 (*schema*, *database*)
  9. #
  10. # 目标:生成包含完整表注释和字段注释的纯SQL代码文档
  11. echo "🔄 开始拼接数据库相关代码..."
  12. # 设置路径
  13. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
  14. DB_DIR="${SCRIPT_DIR}/output_sourcecode/db"
  15. OUTPUT_DIR="${SCRIPT_DIR}/output_docs"
  16. OUTPUT_FILE="${OUTPUT_DIR}/数据库代码.txt"
  17. # 确保输出目录存在
  18. mkdir -p "${OUTPUT_DIR}"
  19. # 主要查找数据库SQL文件目录
  20. SEARCH_DIRS=("${DB_DIR}")
  21. # 数据库相关文件模式(主要关注SQL文件)
  22. DB_PATTERNS=("*.sql" "*.ddl" "*schema*" "*database*")
  23. # 查找所有数据库相关文件
  24. DB_FILES=()
  25. for search_dir in "${SEARCH_DIRS[@]}"; do
  26. if [ -d "$search_dir" ]; then
  27. for pattern in "${DB_PATTERNS[@]}"; do
  28. while IFS= read -r -d '' file; do
  29. # 跳过二进制文件和缓存文件
  30. if [[ ! "$file" =~ \.(pyc|pyo|pyd|__pycache__)$ ]]; then
  31. DB_FILES+=("$file")
  32. fi
  33. done < <(find "$search_dir" -name "$pattern" -type f -print0 2>/dev/null | sort -z)
  34. done
  35. fi
  36. done
  37. # 去重并排序
  38. DB_FILES=($(printf '%s\n' "${DB_FILES[@]}" | sort -u))
  39. if [ ${#DB_FILES[@]} -eq 0 ]; then
  40. echo "❌ 未找到数据库SQL文件"
  41. echo "💡 查找路径: ${DB_DIR}"
  42. echo "💡 查找模式: ${DB_PATTERNS[*]}"
  43. echo ""
  44. echo "💡 提示:如果还没有生成数据库代码,请先:"
  45. echo " 1. 使用AI生成数据库SQL代码到 output_sourcecode/db/ 目录"
  46. echo " 2. 确保生成的SQL文件包含完整的表注释和字段注释"
  47. echo " 3. 推荐文件名:database_schema.sql, init_data.sql, indexes.sql"
  48. exit 1
  49. fi
  50. echo "📁 找到 ${#DB_FILES[@]} 个数据库相关文件"
  51. # 显示找到的文件
  52. echo "📋 数据库文件列表:"
  53. for file in "${DB_FILES[@]}"; do
  54. echo " - ${file#$SCRIPT_DIR/}"
  55. done
  56. echo ""
  57. # 清空输出文件(不添加头部信息,保持纯代码格式)
  58. > "${OUTPUT_FILE}"
  59. # 拼接所有数据库文件
  60. counter=1
  61. for file in "${DB_FILES[@]}"; do
  62. relative_path="${file#$SCRIPT_DIR/}"
  63. filename=$(basename "$file")
  64. extension="${filename##*.}"
  65. echo "📄 处理 ($counter/${#DB_FILES[@]}): $relative_path"
  66. # 根据文件类型设置注释格式
  67. case "$extension" in
  68. "sql")
  69. comment_prefix="--"
  70. ;;
  71. "py")
  72. comment_prefix="#"
  73. ;;
  74. "json")
  75. comment_prefix="//"
  76. ;;
  77. "yml"|"yaml")
  78. comment_prefix="#"
  79. ;;
  80. *)
  81. comment_prefix="#"
  82. ;;
  83. esac
  84. # 添加文件分隔符
  85. cat >> "${OUTPUT_FILE}" << EOF
  86. $comment_prefix ================= $relative_path =================
  87. EOF
  88. # 直接追加文件内容
  89. if [ -r "$file" ]; then
  90. # 检查是否是文本文件
  91. if file "$file" | grep -q "text"; then
  92. cat "$file" >> "${OUTPUT_FILE}"
  93. else
  94. echo "$comment_prefix 二进制文件,内容省略: $relative_path" >> "${OUTPUT_FILE}"
  95. fi
  96. else
  97. echo "$comment_prefix 无法读取文件: $relative_path" >> "${OUTPUT_FILE}"
  98. fi
  99. # 添加文件结束分隔符
  100. cat >> "${OUTPUT_FILE}" << EOF
  101. $comment_prefix ================= $relative_path 结束 =================
  102. EOF
  103. ((counter++))
  104. done
  105. # 显示结果
  106. if [ -f "${OUTPUT_FILE}" ]; then
  107. file_size=$(wc -c < "${OUTPUT_FILE}")
  108. line_count=$(wc -l < "${OUTPUT_FILE}")
  109. echo "✅ 拼接完成!"
  110. echo "📁 输出文件: ${OUTPUT_FILE}"
  111. # 兼容性处理文件大小显示
  112. if [ $file_size -gt 1048576 ]; then
  113. size_str="$(awk "BEGIN {printf \"%.1f MB\", $file_size/1048576}")"
  114. elif [ $file_size -gt 1024 ]; then
  115. size_str="$(awk "BEGIN {printf \"%.1f KB\", $file_size/1024}")"
  116. else
  117. size_str="${file_size} bytes"
  118. fi
  119. echo "📊 文件大小: ${size_str}"
  120. echo "📋 总行数: $line_count"
  121. else
  122. echo "❌ 生成失败"
  123. exit 1
  124. fi