Builder's DayOctober 26 · SFGet tickets

Prisma 8 extension

pgvector

Vector columns and similarity search for embeddings.

By PrismaPostgreSQL

What it does

Adds the pgvector Vector(n) column type, cosine and other distance operators, and vector indexes. Ships the migration that runs CREATE EXTENSION IF NOT EXISTS vector, so db init installs pgvector for you.

Register it in the config

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

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

Register it on the client

src/prisma/db.ts
import pgvector from '@prisma/orm-extension-pgvector/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: [pgvector],
});

Declare a vector column

src/prisma/contract.prisma
types {
  Embedding1536 = pgvector.Vector(1536)
}

model Post {
  id        String         @id @default(uuid())
  title     String
  embedding Embedding1536?
}

Query by similarity

src/prisma/similarity-search.ts
const plan = db.sql.public.post
  .select('id', 'title')
  .select('distance', (f, fns) => fns.cosineDistance(f.embedding, queryVector))
  .orderBy((f, fns) => fns.cosineDistance(f.embedding, queryVector), { direction: 'asc' })
  .limit(10)
  .build();

const similar = await db.runtime().query(plan);

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.