Builder's DayOctober 26 · SFGet tickets

Prisma 8 extension

PostGIS

Geometry columns and geospatial queries such as distance and containment.

By PrismaPostgreSQL

What it does

Stores points, lines, and polygons as a typed Geometry column with optional SRID, reads and writes them as GeoJSON-shaped values, and adds seven query operations: distance, distanceSphere, dwithin, contains, within, intersects, and intersectsBbox. Declares PostGIS as a database dependency so db init enables it.

Register it in the config

prisma.config.ts
import { definePrismaConfig } from 'prisma/config';
import postgis from '@prisma/orm-extension-postgis/control';
import { defineConfig as ormConfig } from '@prisma/orm-postgres/config';

export default definePrismaConfig({
  orm: ormConfig({
    contract: './src/prisma/contract.prisma',
    extensions: [postgis],
    db: {
      connection: process.env['DATABASE_URL']!,
    },
  }),
});

Register it on the client

src/prisma/db.ts
import postgis from '@prisma/orm-extension-postgis/runtime';
import postgres from '@prisma/orm-postgres/runtime';
import type { Contract } from './contract.d';
import contractJson from './contract.json' with { type: 'json' };

export const db = postgres<Contract>({
  contractJson,
  url: process.env['DATABASE_URL']!,
  extensions: [postgis],
});

Declare a geometry column

src/prisma/contract.prisma
types {
  Point4326 = postgis.Geometry(4326)
}

model Place {
  id       String    @id @default(uuid())
  name     String
  location Point4326
}

Then run npx prisma@latest db init, or db update on an existing database. The extension ships its own migration for anything the database needs installed. Full walkthrough in the extensions docs.