Files
crm-ai/scripts/import-kb-snapshot.sh

53 lines
2.4 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# 在没有旧 bridge 的环境导入 KB 快照(默认导入 crmnew-postgres/bridge)。
# 用法:
# bash scripts/import-kb-snapshot.sh [seed.sql.gz]
# FORCE=1 bash scripts/import-kb-snapshot.sh # 覆盖已有 kb_docs(会 DROP)
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
SEED="${1:-$ROOT/deploy/seeds/kb_docs.sql.gz}"
TARGET_CONTAINER="${TARGET_PG_CONTAINER:-crmnew-postgres}"
TARGET_DB="${TARGET_PG_DB:-bridge}"
TARGET_USER="${TARGET_PG_USER:-crmnew}"
if [ ! -f "$SEED" ]; then echo "seed not found: $SEED" >&2; exit 1; fi
# 确保数据库存在
if ! docker exec "$TARGET_CONTAINER" psql -U "$TARGET_USER" -d postgres -tAc \
"SELECT 1 FROM pg_database WHERE datname='$TARGET_DB'" | grep -q 1; then
docker exec "$TARGET_CONTAINER" psql -U "$TARGET_USER" -d postgres -c "CREATE DATABASE \"$TARGET_DB\""
fi
docker exec "$TARGET_CONTAINER" psql -U "$TARGET_USER" -d "$TARGET_DB" -c \
"CREATE EXTENSION IF NOT EXISTS vector;" >/dev/null
# 旧 dump 带 tsv trigger,先确保函数存在
docker exec -i "$TARGET_CONTAINER" psql -U "$TARGET_USER" -d "$TARGET_DB" >/dev/null <<'SQL'
CREATE OR REPLACE FUNCTION public.kb_docs_tsv_update() RETURNS trigger AS $$
BEGIN
NEW.text_tsv := to_tsvector('english',
coalesce(NEW.question,'') || ' ' || coalesce(NEW.answer,'') || ' ' ||
coalesce(array_to_string(NEW.keywords,' '),'') || ' ' ||
coalesce(NEW.title,'') || ' ' || coalesce(NEW.section,''));
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
SQL
EXISTS=$(docker exec "$TARGET_CONTAINER" psql -U "$TARGET_USER" -d "$TARGET_DB" -tAc \
"SELECT to_regclass('public.kb_docs') IS NOT NULL")
if [ "$EXISTS" = "t" ]; then
if [ "${FORCE:-0}" != "1" ]; then
echo "[import-kb] kb_docs already exists in $TARGET_DB; refusing to overwrite. Set FORCE=1 to drop it." >&2
exit 1
fi
echo "[import-kb] FORCE=1: dropping existing kb_docs in $TARGET_DB"
docker exec "$TARGET_CONTAINER" psql -U "$TARGET_USER" -d "$TARGET_DB" -c "DROP TABLE IF EXISTS kb_docs CASCADE" >/dev/null
fi
gunzip -c "$SEED" | docker exec -i "$TARGET_CONTAINER" psql -U "$TARGET_USER" -d "$TARGET_DB" -v ON_ERROR_STOP=1 >/dev/null
COUNT=$(docker exec "$TARGET_CONTAINER" psql -U "$TARGET_USER" -d "$TARGET_DB" -tAc "SELECT count(*) FROM kb_docs")
echo "[import-kb] imported kb_docs rows=$COUNT into $TARGET_CONTAINER/$TARGET_DB"
echo "[import-kb] 提示: bridge 的 RAG_PG_URL 应指向该库(容器内通常是 postgres://...@postgres:5432/$TARGET_DB)"