53 lines
2.4 KiB
Bash
Executable File
53 lines
2.4 KiB
Bash
Executable File
#!/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)"
|