Skip to content

Node.js / TypeScript: Prisma

Applies a Prisma migration (_prisma_migrations, advisory locks, introspection), then creates and counts rows through the generated client. The code is the same against the original database and against MachSQL; only the address changes.

DATABASE_URL=postgresql://app:${DB_PASSWORD}@old-postgres:5432/app
DATABASE_URL=postgresql://app:${DB_PASSWORD}@machsql-host:5432/app

Nothing else changes: not the code, not the driver, not its version, not the SQL.

  • Node.js 26 LTS
  • Prisma 7.10.1 with @prisma/adapter-pg 7.10.1
  • TypeScript 7.0.2, tsx 4.23.15
Terminal window
npm install
export DATABASE_URL=postgresql://app:${DB_PASSWORD}@machsql-host:5432/app
npm run migrate
npm run generate
npm start

Expected output: inserted todo <id>, <n> open.

The program as it is kept and tested in the Mach Database for PostgreSQL repository; highlighted lines read the connection setting.

prisma.config.ts
import { defineConfig, env } from "prisma/config";
export default defineConfig({
schema: "prisma/schema.prisma",
migrations: { path: "prisma/migrations" },
datasource: { url: env("DATABASE_URL") },
});
src/index.ts
// Prisma ORM with the pg driver adapter.
import { PrismaPg } from "@prisma/adapter-pg";
import { PrismaClient } from "./generated/prisma/client.js";
const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL });
const prisma = new PrismaClient({ adapter });
try {
const todo = await prisma.todo.create({ data: { title: "write the examples" } });
const open = await prisma.todo.count({ where: { done: false } });
console.log(`inserted todo ${todo.id}, ${open} open`);
} finally {
await prisma.$disconnect();
}
.gitignore
node_modules/
src/generated/
package.json
{
"name": "machsql-example-node-prisma",
"private": true,
"type": "module",
"scripts": {
"migrate": "prisma migrate deploy",
"generate": "prisma generate",
"start": "tsx src/index.ts"
},
"dependencies": {
"@prisma/adapter-pg": "7.10.1",
"@prisma/client": "7.10.1"
},
"devDependencies": {
"@types/node": "26.6.6",
"prisma": "7.10.1",
"tsx": "4.23.15",
"typescript": "7.0.2"
}
}
prisma/migrations/20261030000000_init/migration.sql
CREATE TABLE "prisma_todo" (
"id" BIGSERIAL NOT NULL,
"title" TEXT NOT NULL,
"done" BOOLEAN NOT NULL DEFAULT false,
CONSTRAINT "prisma_todo_pkey" PRIMARY KEY ("id")
);
prisma/migrations/migration_lock.toml
provider = "postgresql"
prisma/schema.prisma
generator client {
provider = "prisma-client"
output = "../src/generated/prisma"
}
datasource db {
provider = "postgresql"
}
model Todo {
id BigInt @id @default(autoincrement())
title String
done Boolean @default(false)
@@map("prisma_todo")
}