@entrolytics/drizzle-client
v2.2.0
Published
Drizzle ORM client for Entrolytics - First-party growth analytics for the edge
Maintainers
Readme
Overview
@entrolytics/drizzle-client is the official Drizzle ORM client for Entrolytics - first-party growth analytics for the edge. Provides a type-safe database layer with built-in support for Neon serverless PostgreSQL and read replicas.
Why use this client?
- Neon serverless optimized with HTTP connections
- Automatic read/write replica routing
- Full transaction support with isolation levels
- Built-in health checks and connection pooling
Key Features
Database Support
- Neon serverless PostgreSQL
- Standard PostgreSQL support
- Connection pooling
- Read replica routing
Developer Experience
- Full TypeScript support
- Transaction isolation levels
- Health monitoring
- Debug query logging
Quick Start
Installation
pnpm add @entrolytics/drizzle-clientFeatures
- Neon Serverless Support: Optimized for Neon PostgreSQL with HTTP connections
- Read Replicas: Automatic routing of read queries to replica databases
- Transaction Support: Full transaction support with isolation levels
- Health Checks: Built-in database health monitoring
- Connection Pooling: Configurable connection pooling for standard PostgreSQL
- Debug Logging: Optional query logging via
debugpackage
Usage
Basic Setup
import { EntrolyticsDrizzleClient } from '@entrolytics/drizzle-client';
import * as schema from './schema';
const db = new EntrolyticsDrizzleClient({
url: process.env.DATABASE_URL,
schema,
logQuery: process.env.NODE_ENV === 'development',
});
// Use the client
const users = await db.client.select().from(schema.users);With Read Replica
const db = new EntrolyticsDrizzleClient({
url: process.env.DATABASE_URL,
replicaUrl: process.env.DATABASE_REPLICA_URL,
schema,
});
// Reads automatically use replica
const users = await db.getReadClient().select().from(schema.users);
// Writes always use primary
await db.getWriteClient().insert(schema.users).values({ name: 'John' });Transactions
const result = await db.transaction(async (tx) => {
const user = await tx.insert(schema.users).values({ name: 'John' }).returning();
await tx.insert(schema.profiles).values({ userId: user[0].id });
return user;
}, {
isolationLevel: 'serializable',
});Raw Queries
// Automatically routes to replica for SELECT queries
const result = await db.rawQuery<User>('SELECT * FROM users WHERE id = $1', [userId]);Health Check
const health = await db.healthCheck();
// { ok: true, latency: 23 }Configuration Options
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| url | string | required | Primary database connection URL |
| replicaUrl | string | - | Read replica connection URL |
| schema | object | - | Drizzle schema object |
| logQuery | boolean | false | Enable query logging |
| queryLogger | function | - | Custom query logger function |
| type | 'neon' \| 'postgres' | 'neon' | Database type |
| poolConfig | object | - | Connection pool configuration |
License
MIT - Entrolytics
