diff --git a/backend/scripts/README_seed.md b/backend/scripts/README_seed.md new file mode 100644 index 0000000..a0d36f7 --- /dev/null +++ b/backend/scripts/README_seed.md @@ -0,0 +1,37 @@ +# DB reset + seed (dev-machine) + +This repo uses Alembic migrations as schema source-of-truth. + +## Reset to the current seed + +```bash +cd backend +./scripts/reset_db.sh +``` + +Environment variables (optional): + +- `DB_NAME` (default `openclaw_agency`) +- `DB_USER` (default `postgres`) +- `DB_HOST` (default `127.0.0.1`) +- `DB_PORT` (default `5432`) +- `DB_PASSWORD` (default `postgres`) + +## Updating the seed + +The seed is a **data-only** dump (not schema). Regenerate it from the current DB state: + +```bash +cd backend +PGPASSWORD=postgres pg_dump \ + --data-only \ + --column-inserts \ + --disable-triggers \ + --no-owner \ + --no-privileges \ + -U postgres -h 127.0.0.1 -d openclaw_agency \ + > scripts/seed_data.sql + +# IMPORTANT: do not include alembic_version in the seed (migrations already set it) +# (our committed seed already has this removed) +``` diff --git a/backend/scripts/reset_db.sh b/backend/scripts/reset_db.sh new file mode 100755 index 0000000..f76d0f8 --- /dev/null +++ b/backend/scripts/reset_db.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +set -euo pipefail + +DB_NAME=${DB_NAME:-openclaw_agency} +DB_USER=${DB_USER:-postgres} +DB_HOST=${DB_HOST:-127.0.0.1} +DB_PORT=${DB_PORT:-5432} +DB_PASSWORD=${DB_PASSWORD:-postgres} + +cd "$(dirname "$0")/.." + +export PGPASSWORD="$DB_PASSWORD" + +# 1) wipe schema +psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -v ON_ERROR_STOP=1 \ + -c 'DROP SCHEMA public CASCADE; CREATE SCHEMA public;' + +# 2) migrate +. .venv/bin/activate +alembic upgrade head + +# 3) seed +psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -v ON_ERROR_STOP=1 \ + -f scripts/seed_data.sql + +echo "Reset complete: $DB_USER@$DB_HOST:$DB_PORT/$DB_NAME" diff --git a/backend/scripts/seed_data.sql b/backend/scripts/seed_data.sql new file mode 100644 index 0000000..9e72c2f --- /dev/null +++ b/backend/scripts/seed_data.sql @@ -0,0 +1,160 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 16.9 (Ubuntu 16.9-0ubuntu0.24.04.1) +-- Dumped by pg_dump version 16.9 (Ubuntu 16.9-0ubuntu0.24.04.1) + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +-- +-- Data for Name: departments; Type: TABLE DATA; Schema: public; Owner: - +-- + +SET SESSION AUTHORIZATION DEFAULT; + +ALTER TABLE public.departments DISABLE TRIGGER ALL; + + + +ALTER TABLE public.departments ENABLE TRIGGER ALL; + +-- +-- Data for Name: employees; Type: TABLE DATA; Schema: public; Owner: - +-- + +ALTER TABLE public.employees DISABLE TRIGGER ALL; + + + +ALTER TABLE public.employees ENABLE TRIGGER ALL; + +-- +-- Data for Name: activities; Type: TABLE DATA; Schema: public; Owner: - +-- + +ALTER TABLE public.activities DISABLE TRIGGER ALL; + + + +ALTER TABLE public.activities ENABLE TRIGGER ALL; + +-- +-- Data for Name: teams; Type: TABLE DATA; Schema: public; Owner: - +-- + +ALTER TABLE public.teams DISABLE TRIGGER ALL; + + + +ALTER TABLE public.teams ENABLE TRIGGER ALL; + +-- +-- Data for Name: projects; Type: TABLE DATA; Schema: public; Owner: - +-- + +ALTER TABLE public.projects DISABLE TRIGGER ALL; + + + +ALTER TABLE public.projects ENABLE TRIGGER ALL; + +-- +-- Data for Name: project_members; Type: TABLE DATA; Schema: public; Owner: - +-- + +ALTER TABLE public.project_members DISABLE TRIGGER ALL; + + + +ALTER TABLE public.project_members ENABLE TRIGGER ALL; + +-- +-- Data for Name: tasks; Type: TABLE DATA; Schema: public; Owner: - +-- + +ALTER TABLE public.tasks DISABLE TRIGGER ALL; + + + +ALTER TABLE public.tasks ENABLE TRIGGER ALL; + +-- +-- Data for Name: task_comments; Type: TABLE DATA; Schema: public; Owner: - +-- + +ALTER TABLE public.task_comments DISABLE TRIGGER ALL; + + + +ALTER TABLE public.task_comments ENABLE TRIGGER ALL; + +-- +-- Name: activities_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.activities_id_seq', 1, false); + + +-- +-- Name: departments_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.departments_id_seq', 1, false); + + +-- +-- Name: employees_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.employees_id_seq', 1, true); + + +-- +-- Name: project_members_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.project_members_id_seq', 1, false); + + +-- +-- Name: projects_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.projects_id_seq', 1, false); + + +-- +-- Name: task_comments_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.task_comments_id_seq', 1, false); + + +-- +-- Name: tasks_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.tasks_id_seq', 1, false); + + +-- +-- Name: teams_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.teams_id_seq', 1, false); + + +-- +-- PostgreSQL database dump complete +-- +