152 lines
4.2 KiB
Bash
Executable File
152 lines
4.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
usage() {
|
|
cat <<'USAGE'
|
|
用法:
|
|
scripts/run_rag_public_orphan_defaults_migration.sh [连接参数] [--migrate --yes]
|
|
|
|
连接方式二选一:
|
|
1. 使用 DATABASE_URL:
|
|
DATABASE_URL='postgresql://user:password@host:5432/dbname' scripts/run_rag_public_orphan_defaults_migration.sh
|
|
|
|
2. 使用 psql 参数:
|
|
scripts/run_rag_public_orphan_defaults_migration.sh -h <host> -U <user> -d <db_name> [-p <port>]
|
|
|
|
默认行为:
|
|
只执行迁移前检查,不修改数据库。
|
|
|
|
执行迁移:
|
|
先确认 precheck 输出符合预期,再追加 --migrate --yes:
|
|
scripts/run_rag_public_orphan_defaults_migration.sh -h <host> -U <user> -d <db_name> --migrate --yes
|
|
|
|
环境变量:
|
|
PGPASSWORD 可用于非交互输入数据库密码。
|
|
USAGE
|
|
}
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
PRECHECK_SQL="${REPO_ROOT}/scripts/创建sql/precheck_rag_public_orphan_defaults.sql"
|
|
MIGRATE_SQL="${REPO_ROOT}/scripts/创建sql/migrate_rag_public_orphan_defaults.sql"
|
|
LOG_DIR="${REPO_ROOT}/logs/rag-public-orphan-defaults"
|
|
|
|
PSQL_ARGS=()
|
|
RUN_MIGRATION=false
|
|
CONFIRMED=false
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
-h|--host)
|
|
[[ $# -ge 2 ]] || { echo "缺少 $1 的值" >&2; exit 2; }
|
|
PSQL_ARGS+=("-h" "$2")
|
|
shift 2
|
|
;;
|
|
-U|--username)
|
|
[[ $# -ge 2 ]] || { echo "缺少 $1 的值" >&2; exit 2; }
|
|
PSQL_ARGS+=("-U" "$2")
|
|
shift 2
|
|
;;
|
|
-d|--dbname)
|
|
[[ $# -ge 2 ]] || { echo "缺少 $1 的值" >&2; exit 2; }
|
|
PSQL_ARGS+=("-d" "$2")
|
|
shift 2
|
|
;;
|
|
-p|--port)
|
|
[[ $# -ge 2 ]] || { echo "缺少 $1 的值" >&2; exit 2; }
|
|
PSQL_ARGS+=("-p" "$2")
|
|
shift 2
|
|
;;
|
|
--migrate)
|
|
RUN_MIGRATION=true
|
|
shift
|
|
;;
|
|
--yes)
|
|
CONFIRMED=true
|
|
shift
|
|
;;
|
|
--help)
|
|
usage
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "未知参数: $1" >&2
|
|
usage
|
|
exit 2
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if ! command -v psql >/dev/null 2>&1; then
|
|
echo "未找到 psql,请先安装 PostgreSQL client。" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -f "${PRECHECK_SQL}" ]]; then
|
|
echo "找不到预检查 SQL: ${PRECHECK_SQL}" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -f "${MIGRATE_SQL}" ]]; then
|
|
echo "找不到迁移 SQL: ${MIGRATE_SQL}" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -n "${DATABASE_URL:-}" && ${#PSQL_ARGS[@]} -gt 0 ]]; then
|
|
echo "请不要同时使用 DATABASE_URL 和 -h/-U/-d 参数。" >&2
|
|
exit 2
|
|
fi
|
|
|
|
if [[ -z "${DATABASE_URL:-}" && ${#PSQL_ARGS[@]} -eq 0 ]]; then
|
|
echo "缺少数据库连接参数。请设置 DATABASE_URL,或传入 -h/-U/-d。" >&2
|
|
usage
|
|
exit 2
|
|
fi
|
|
|
|
if [[ "${RUN_MIGRATION}" == true && "${CONFIRMED}" != true ]]; then
|
|
echo "迁移会修改数据库。请先检查 precheck 输出,确认后追加 --yes。" >&2
|
|
exit 2
|
|
fi
|
|
|
|
mkdir -p "${LOG_DIR}"
|
|
TIMESTAMP="$(date +%Y%m%d-%H%M%S)"
|
|
PRECHECK_LOG="${LOG_DIR}/precheck-${TIMESTAMP}.log"
|
|
MIGRATE_LOG="${LOG_DIR}/migrate-${TIMESTAMP}.log"
|
|
|
|
run_psql_file() {
|
|
local sql_file="$1"
|
|
local log_file="$2"
|
|
|
|
if [[ -n "${DATABASE_URL:-}" ]]; then
|
|
psql "${DATABASE_URL}" -v ON_ERROR_STOP=1 -f "${sql_file}" 2>&1 | tee "${log_file}"
|
|
else
|
|
psql "${PSQL_ARGS[@]}" -v ON_ERROR_STOP=1 -f "${sql_file}" 2>&1 | tee "${log_file}"
|
|
fi
|
|
}
|
|
|
|
echo "开始执行 RAG 公共知识库未归属默认项预检查..."
|
|
echo "预检查输出: ${PRECHECK_LOG}"
|
|
run_psql_file "${PRECHECK_SQL}" "${PRECHECK_LOG}"
|
|
|
|
if [[ "${RUN_MIGRATION}" != true ]]; then
|
|
cat <<EOF
|
|
|
|
预检查已完成,未执行迁移。
|
|
请确认上方第 1 段候选只包含需要从“未分配地区”迁到“公共”的历史公共知识库。
|
|
确认后执行同一命令并追加: --migrate --yes
|
|
EOF
|
|
exit 0
|
|
fi
|
|
|
|
echo
|
|
echo "开始执行迁移..."
|
|
echo "迁移输出: ${MIGRATE_LOG}"
|
|
run_psql_file "${MIGRATE_SQL}" "${MIGRATE_LOG}"
|
|
|
|
cat <<EOF
|
|
|
|
迁移脚本已执行完成。
|
|
请检查迁移输出中的 public_default_count,应为 1。
|
|
然后刷新 /chat-with-llm/dataset-manager,原“未分配地区”的默认项应归入“公共”,并且非默认项可以删除。
|
|
EOF
|