Fix
This commit is contained in:
62
water-api/scripts/run-migration.sh
Executable file
62
water-api/scripts/run-migration.sh
Executable file
@@ -0,0 +1,62 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# Database Migration Script
|
||||||
|
# Run a specific SQL migration file against the database
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Load environment variables
|
||||||
|
if [ -f ../.env ]; then
|
||||||
|
export $(cat ../.env | grep -v '^#' | xargs)
|
||||||
|
else
|
||||||
|
echo -e "${RED}Error: .env file not found${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if migration file is provided
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
echo -e "${YELLOW}Usage: ./run-migration.sh <migration-file.sql>${NC}"
|
||||||
|
echo ""
|
||||||
|
echo "Available migrations:"
|
||||||
|
ls -1 ../sql/*.sql | grep -v schema.sql
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
MIGRATION_FILE=$1
|
||||||
|
|
||||||
|
# Check if file exists
|
||||||
|
if [ ! -f "../sql/$MIGRATION_FILE" ]; then
|
||||||
|
echo -e "${RED}Error: Migration file not found: ../sql/$MIGRATION_FILE${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Construct database URL
|
||||||
|
DB_URL="postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}"
|
||||||
|
|
||||||
|
echo -e "${YELLOW}========================================${NC}"
|
||||||
|
echo -e "${YELLOW}Running migration: $MIGRATION_FILE${NC}"
|
||||||
|
echo -e "${YELLOW}Database: $DB_NAME${NC}"
|
||||||
|
echo -e "${YELLOW}========================================${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Run the migration
|
||||||
|
psql "$DB_URL" -f "../sql/$MIGRATION_FILE"
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}========================================${NC}"
|
||||||
|
echo -e "${GREEN}✓ Migration completed successfully!${NC}"
|
||||||
|
echo -e "${GREEN}========================================${NC}"
|
||||||
|
else
|
||||||
|
echo ""
|
||||||
|
echo -e "${RED}========================================${NC}"
|
||||||
|
echo -e "${RED}✗ Migration failed!${NC}"
|
||||||
|
echo -e "${RED}========================================${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
68
water-api/sql/add_meter_project_relation.sql
Normal file
68
water-api/sql/add_meter_project_relation.sql
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
-- ============================================================================
|
||||||
|
-- Add project_id column to meters table
|
||||||
|
-- This establishes the relationship between meters and projects
|
||||||
|
-- ============================================================================
|
||||||
|
|
||||||
|
-- Step 1: Add the column as nullable first (to allow existing data)
|
||||||
|
ALTER TABLE meters
|
||||||
|
ADD COLUMN IF NOT EXISTS project_id UUID;
|
||||||
|
|
||||||
|
-- Step 2: For existing meters without project_id, try to get it from their concentrator
|
||||||
|
UPDATE meters m
|
||||||
|
SET project_id = c.project_id
|
||||||
|
FROM concentrators c
|
||||||
|
WHERE m.concentrator_id = c.id
|
||||||
|
AND m.project_id IS NULL
|
||||||
|
AND m.concentrator_id IS NOT NULL;
|
||||||
|
|
||||||
|
-- Step 3: Add foreign key constraint
|
||||||
|
ALTER TABLE meters
|
||||||
|
DROP CONSTRAINT IF EXISTS meters_project_id_fkey;
|
||||||
|
|
||||||
|
ALTER TABLE meters
|
||||||
|
ADD CONSTRAINT meters_project_id_fkey
|
||||||
|
FOREIGN KEY (project_id)
|
||||||
|
REFERENCES projects(id)
|
||||||
|
ON DELETE CASCADE;
|
||||||
|
|
||||||
|
-- Step 4: Create index for better query performance
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_meters_project_id ON meters(project_id);
|
||||||
|
|
||||||
|
-- Step 5: Add comment for documentation
|
||||||
|
COMMENT ON COLUMN meters.project_id IS 'Project to which this meter belongs';
|
||||||
|
|
||||||
|
-- ============================================================================
|
||||||
|
-- Verify the changes
|
||||||
|
-- ============================================================================
|
||||||
|
|
||||||
|
-- Check if the column was added
|
||||||
|
SELECT
|
||||||
|
column_name,
|
||||||
|
data_type,
|
||||||
|
is_nullable,
|
||||||
|
column_default
|
||||||
|
FROM information_schema.columns
|
||||||
|
WHERE table_name = 'meters'
|
||||||
|
AND column_name = 'project_id';
|
||||||
|
|
||||||
|
-- Check the constraint
|
||||||
|
SELECT
|
||||||
|
conname AS constraint_name,
|
||||||
|
contype AS constraint_type,
|
||||||
|
pg_get_constraintdef(oid) AS constraint_definition
|
||||||
|
FROM pg_constraint
|
||||||
|
WHERE conrelid = 'meters'::regclass
|
||||||
|
AND conname LIKE '%project_id%';
|
||||||
|
|
||||||
|
-- Show meters with their project info
|
||||||
|
SELECT
|
||||||
|
m.id,
|
||||||
|
m.name,
|
||||||
|
m.serial_number,
|
||||||
|
m.project_id,
|
||||||
|
p.name AS project_name,
|
||||||
|
c.name AS concentrator_name
|
||||||
|
FROM meters m
|
||||||
|
LEFT JOIN projects p ON m.project_id = p.id
|
||||||
|
LEFT JOIN concentrators c ON m.concentrator_id = c.id
|
||||||
|
LIMIT 10;
|
||||||
Reference in New Issue
Block a user