PostgreSQL Client for Constructive.io (pgsql-client)

3.9.3 · active · verified Wed Apr 22

pgsql-client is a PostgreSQL client utility specifically designed as a core component of the constructive-io ecosystem. It provides robust query helpers, integrated Row-Level Security (RLS) context management, and tools for database administration, emphasizing a database-first approach to application development. This library ships with comprehensive TypeScript types, enabling developers to build type-safe, modular PostgreSQL applications by treating the database as a version-controlled system. Its current stable version, 3.9.3, reflects ongoing development within the constructive-io framework. The project's release cadence is tied to the broader constructive-io ecosystem, which maintains active development. Key differentiators include its deep integration with RLS for fine-grained access control, support for modular database design via tools like `pgpm`, and rich developer tooling to streamline secure and scalable PostgreSQL backend development. It is important to distinguish this package from the `postgresql-client` NPM package, which was renamed to `postgrejs`.

Common errors

Warnings

Install

Imports

Quickstart

Demonstrates connecting to a PostgreSQL database, setting Row-Level Security (RLS) context, and executing a query that is automatically filtered by the server-side RLS policies based on the session context.

import { Client } from 'pgsql-client';

async function runPgsqlClientExample() {
  // Ensure DATABASE_URL is set in your environment or provide a default
  const connectionString = process.env.DATABASE_URL ?? 'postgresql://user:password@localhost:5432/mydb';

  let client: Client | undefined;
  try {
    // Initialize and connect the PostgreSQL client
    client = new Client(connectionString);
    await client.connect();
    console.log('Successfully connected to PostgreSQL database.');

    // Set RLS context for the current session, crucial for secure data access
    // In a real application, this context comes from an authenticated user's JWT claims or session data.
    const currentUser = {
      id: 'usr_abc123',
      role: 'authenticated',
      tenant_id: 'org_xyz'
    };
    await client.setContext({
      role: currentUser.role,
      'jwt.claims.user_id': currentUser.id,
      'app.tenant_id': currentUser.tenant_id // Custom context variable for multi-tenancy
    });
    console.log(`RLS context set for user '${currentUser.id}' in tenant '${currentUser.tenant_id}'.`);

    // Execute a query; RLS policies on the server will automatically filter results
    // based on the 'app.tenant_id' set in the context.
    const result = await client.query('SELECT id, name, description FROM products WHERE tenant_id = current_setting(\'app.tenant_id\', true)::text ORDER BY name LIMIT 3');
    console.log('Query executed. Products (filtered by RLS):', result.rows);

  } catch (error: any) {
    console.error('Database operation failed:', error.message);
  } finally {
    if (client) {
      // Always ensure the client connection is closed
      await client.close();
      console.log('PostgreSQL connection closed.');
    }
  }
}

runPgsqlClientExample();

view raw JSON →