itechmeat

postgresql

1
0
# Install this skill:
npx skills add itechmeat/llm-code --skill "postgresql"

Install specific skill from multi-skill repository

# Description

PostgreSQL best practices: multi-tenancy with RLS, schema design, Alembic migrations, async SQLAlchemy, and query optimization.

# SKILL.md


name: postgresql
description: "PostgreSQL best practices: multi-tenancy with RLS, schema design, Alembic migrations, async SQLAlchemy, and query optimization."
version: "18.1"
release_date: "2025-11-13"


PostgreSQL

When to use

  • Designing or changing multi-tenant tables with Row-Level Security (RLS)
  • Debugging tenant isolation issues
  • Adding/changing Alembic migrations for schema, RLS policies, or indexes
  • Writing tests that validate RLS isolation
  • Configuring PostgreSQL authentication, replication, or tuning

RLS Multi-tenancy Pattern

Non-negotiables

  • RLS context is mandatory for any tenant-scoped query
  • Context must be set inside the same transaction as the queries
  • No fallbacks for tenant ID (fail fast if missing)
  • Async-only DB access when using async frameworks

Setting RLS Context

RLS works only if the current transaction has the context set:

SET LOCAL app.current_tenant_id = '<tenant_uuid>';

Must run before the first tenant-scoped query in that transaction.

Common Failure Modes

  • Setting SET LOCAL ... after the first select()
  • Setting the context in one session, then querying in another
  • Running queries outside the expected transaction scope

Typical RLS Policy

ALTER TABLE some_table ENABLE ROW LEVEL SECURITY;

CREATE POLICY some_table_tenant_isolation
ON some_table
USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

Multi-tenant Table Checklist

  • Tenant ID column is UUID
  • FK to tenants table with ON DELETE CASCADE
  • Indexes aligned with access patterns (usually tenant_id first)
  • PostgreSQL does not auto-index FK columns β€” add explicit indexes
  • UNIQUE allows multiple NULLs unless using NULLS NOT DISTINCT (PG15+)
  • RLS is enabled and policies exist
  • Application code sets RLS context at transaction start

Alembic Migrations Checklist

  1. Add/modify schema (columns, constraints, FKs)
  2. Create/update indexes
  3. Enable RLS and create/adjust policies
  4. Add verification (tests) for isolation
  5. Provide a real downgrade (no stubs)

RLS Isolation Testing Recipe

Goal:

  • Data for tenant A is visible to tenant A
  • Data for tenant A is NOT visible to tenant B

Canonical flow:

  1. Setup data through an admin session (RLS bypass) for tenant A and B
  2. Assert via an RLS session:
  3. set context to tenant A β†’ sees only tenant A data
  4. set context to tenant B β†’ does not see tenant A data

Destructive Operations Safety

Hard rules:

  • Never run DELETE without a narrow WHERE targeting specific data
  • Never run TRUNCATE/DROP without explicit confirmation

Pre-flight before destructive actions:

  1. Confirm exact target (tables / IDs / date range)
  2. Run a SELECT/row count first and show results
  3. Ask for final confirmation, then execute

References

Schema & Design

  • table-design.md β€” Data types, constraints, indexing, partitioning, JSONB, safe schema evolution
  • charset-encoding.md β€” Character sets, encoding, collation, ICU, locale settings

Authentication

Runtime Configuration

  • connection-settings.md β€” listen_addresses, max_connections, SSL, TCP keepalives
  • query-tuning.md β€” Planner settings, work_mem, parallel query, cost constants
  • replication.md β€” Streaming replication, WAL, synchronous commit, logical replication
  • vacuum.md β€” Autovacuum, vacuum cost model, freeze ages, per-table tuning
  • error-handling.md β€” exit_on_error, restart_after_crash, data_sync_retry

Internals

  • internals.md β€” Query processing pipeline, parser/rewriter/planner/executor, system catalogs, wire protocol, access methods
  • protocol.md β€” Wire protocol v3.2: message format, startup, auth, query, COPY, replication

See also

  • sql-expert β€” Query patterns, EXPLAIN workflow, optimization

# Supported AI Coding Agents

This skill is compatible with the SKILL.md standard and works with all major AI coding agents:

Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.