Type API

Use Drizzle’s type helpers to infer select and insert models from a CockroachDB table schema.

import { string, int4, cockroachTable } from 'drizzle-orm/cockroach-core';
import { type InferSelectModel, type InferInsertModel } from 'drizzle-orm';

const users = cockroachTable('users', {
  id: int4('id').primaryKey(),
  name: string('name').notNull(),
});

type SelectUser = typeof users.$inferSelect;
type InsertUser = typeof users.$inferInsert;

type SelectUserAlt = InferSelectModel<typeof users>;
type InsertUserAlt = InferInsertModel<typeof users>;

Logging

Enable default query logging by passing { logger: true } to drizzle.

import { drizzle } from "drizzle-orm/cockroach";

const db = drizzle(process.env.DB_URL, { logger: true });

You can change the logs destination by creating a DefaultLogger instance and providing a custom writer to it:

import { DefaultLogger, type LogWriter } from "drizzle-orm/logger";
import { drizzle } from "drizzle-orm/...";

class MyLogWriter implements LogWriter {
  write(message: string) {
    // Write to file, stdout, etc.
  }
}

const logger = new DefaultLogger({ writer: new MyLogWriter() });
const db = drizzle(process.env.DB_URL, { logger });

You can also provide a custom logger.

import type { Logger } from 'drizzle-orm/logger';
import { drizzle } from "drizzle-orm/cockroach";

class MyLogger implements Logger {
  logQuery(query: string, params: unknown[]): void {
    console.log({ query, params });
  }
}

const db = drizzle(process.env.DB_URL, { logger: new MyLogger() });

Multi-project schema

Use cockroachTableCreator to customize table names when several projects share one database.

import { int4, string, cockroachTableCreator } from 'drizzle-orm/cockroach-core';

const cockroachTable = cockroachTableCreator((name) => `project1_${name}`);

export const users = cockroachTable('users', {
  id: int4().primaryKey(),
  name: string().notNull(),
});
import { defineConfig } from 'drizzle-kit';

export default defineConfig({
  schema: './src/schema/*',
  out: './drizzle',
  dialect: 'cockroach',
  dbCredentials: {
    url: process.env.DATABASE_URL!,
  },
  tablesFilter: ['project1_*'],
});
CREATE TABLE "project1_users" (
        "id" int4 PRIMARY KEY,
        "name" string NOT NULL
);

Printing SQL Query

Print generated SQL from a query with .toSQL().

const query = db
  .select({ id: users.id, name: users.name })
  .from(users)
  .groupBy(users.id)
  .toSQL();

Raw SQL Queries

Use db.execute for raw parametrized SQL.

import { sql } from 'drizzle-orm';

const statement = sql`select * from ${users} where ${users.id} = ${userId}`;
const result = await db.execute(statement);

Standalone Query Builder

Use the CockroachDB query builder without creating a database instance.

import { QueryBuilder } from 'drizzle-orm/cockroach-core';

const qb = new QueryBuilder();
const query = qb.select().from(users).where(eq(users.name, 'Dan'));
const { sql, params } = query.toSQL();

Get Typed Columns

Use getColumns to get a typed column map, which is useful when excluding fields from a selection.

index.ts
schema.ts
import { getColumns } from 'drizzle-orm';
import { users } from './schema';

const { password, role, ...rest } = getColumns(users);

await db.select({ ...rest }).from(users);

Get Table Information

Use getTableConfig to inspect CockroachDB table metadata.

import { getTableConfig, cockroachTable } from 'drizzle-orm/cockroach-core';

export const table = cockroachTable(...);

const { columns, indexes, foreignKeys, checks, primaryKeys, name, schema } =
  getTableConfig(table);

Compare Object Types

Use is() instead of instanceof to check Drizzle object types.

import { Column, is } from 'drizzle-orm';

if (is(value, Column)) {
  // value is narrowed to Column
}

Mock Driver

Use drizzle.mock() when you need a typed database object without a real CockroachDB connection.

import { drizzle } from 'drizzle-orm/node-postgres';
import * as schema from './schema';

const db = drizzle.mock({ schema });