Package Exports
- drizzle-orm
 - drizzle-orm/alias
 - drizzle-orm/aws-data-api/common
 - drizzle-orm/aws-data-api/pg
 - drizzle-orm/aws-data-api/pg/driver
 - drizzle-orm/aws-data-api/pg/migrator
 - drizzle-orm/aws-data-api/pg/session
 - drizzle-orm/batch
 - drizzle-orm/better-sqlite3
 - drizzle-orm/better-sqlite3/driver
 - drizzle-orm/better-sqlite3/migrator
 - drizzle-orm/better-sqlite3/session
 - drizzle-orm/bun-sqlite
 - drizzle-orm/bun-sqlite/driver
 - drizzle-orm/bun-sqlite/migrator
 - drizzle-orm/bun-sqlite/session
 - drizzle-orm/column
 - drizzle-orm/column-builder
 - drizzle-orm/d1
 - drizzle-orm/d1/driver
 - drizzle-orm/d1/migrator
 - drizzle-orm/d1/session
 - drizzle-orm/entity
 - drizzle-orm/errors
 - drizzle-orm/expressions
 - drizzle-orm/knex
 - drizzle-orm/kysely
 - drizzle-orm/libsql
 - drizzle-orm/libsql/driver
 - drizzle-orm/libsql/migrator
 - drizzle-orm/libsql/session
 - drizzle-orm/logger
 - drizzle-orm/migrator
 - drizzle-orm/mysql-core
 - drizzle-orm/mysql-core/alias
 - drizzle-orm/mysql-core/checks
 - drizzle-orm/mysql-core/columns
 - drizzle-orm/mysql-core/columns/bigint
 - drizzle-orm/mysql-core/columns/binary
 - drizzle-orm/mysql-core/columns/boolean
 - drizzle-orm/mysql-core/columns/char
 - drizzle-orm/mysql-core/columns/common
 - drizzle-orm/mysql-core/columns/custom
 - drizzle-orm/mysql-core/columns/date
 - drizzle-orm/mysql-core/columns/date.common
 - drizzle-orm/mysql-core/columns/datetime
 - drizzle-orm/mysql-core/columns/decimal
 - drizzle-orm/mysql-core/columns/double
 - drizzle-orm/mysql-core/columns/enum
 - drizzle-orm/mysql-core/columns/float
 - drizzle-orm/mysql-core/columns/int
 - drizzle-orm/mysql-core/columns/json
 - drizzle-orm/mysql-core/columns/mediumint
 - drizzle-orm/mysql-core/columns/real
 - drizzle-orm/mysql-core/columns/serial
 - drizzle-orm/mysql-core/columns/smallint
 - drizzle-orm/mysql-core/columns/text
 - drizzle-orm/mysql-core/columns/time
 - drizzle-orm/mysql-core/columns/timestamp
 - drizzle-orm/mysql-core/columns/tinyint
 - drizzle-orm/mysql-core/columns/varbinary
 - drizzle-orm/mysql-core/columns/varchar
 - drizzle-orm/mysql-core/columns/year
 - drizzle-orm/mysql-core/db
 - drizzle-orm/mysql-core/dialect
 - drizzle-orm/mysql-core/expressions
 - drizzle-orm/mysql-core/foreign-keys
 - drizzle-orm/mysql-core/indexes
 - drizzle-orm/mysql-core/primary-keys
 - drizzle-orm/mysql-core/query-builders
 - drizzle-orm/mysql-core/query-builders/delete
 - drizzle-orm/mysql-core/query-builders/insert
 - drizzle-orm/mysql-core/query-builders/query
 - drizzle-orm/mysql-core/query-builders/query-builder
 - drizzle-orm/mysql-core/query-builders/select
 - drizzle-orm/mysql-core/query-builders/select.types
 - drizzle-orm/mysql-core/query-builders/update
 - drizzle-orm/mysql-core/schema
 - drizzle-orm/mysql-core/session
 - drizzle-orm/mysql-core/subquery
 - drizzle-orm/mysql-core/table
 - drizzle-orm/mysql-core/unique-constraint
 - drizzle-orm/mysql-core/utils
 - drizzle-orm/mysql-core/view
 - drizzle-orm/mysql-core/view-common
 - drizzle-orm/mysql-proxy
 - drizzle-orm/mysql-proxy/driver
 - drizzle-orm/mysql-proxy/migrator
 - drizzle-orm/mysql-proxy/session
 - drizzle-orm/mysql2
 - drizzle-orm/mysql2/driver
 - drizzle-orm/mysql2/migrator
 - drizzle-orm/mysql2/session
 - drizzle-orm/neon-http
 - drizzle-orm/neon-http/driver
 - drizzle-orm/neon-http/migrator
 - drizzle-orm/neon-http/session
 - drizzle-orm/neon-serverless
 - drizzle-orm/neon-serverless/driver
 - drizzle-orm/neon-serverless/migrator
 - drizzle-orm/neon-serverless/session
 - drizzle-orm/node-postgres
 - drizzle-orm/node-postgres/driver
 - drizzle-orm/node-postgres/migrator
 - drizzle-orm/node-postgres/session
 - drizzle-orm/operations
 - drizzle-orm/pg-core
 - drizzle-orm/pg-core/alias
 - drizzle-orm/pg-core/checks
 - drizzle-orm/pg-core/columns
 - drizzle-orm/pg-core/columns/bigint
 - drizzle-orm/pg-core/columns/bigserial
 - drizzle-orm/pg-core/columns/boolean
 - drizzle-orm/pg-core/columns/char
 - drizzle-orm/pg-core/columns/cidr
 - drizzle-orm/pg-core/columns/common
 - drizzle-orm/pg-core/columns/custom
 - drizzle-orm/pg-core/columns/date
 - drizzle-orm/pg-core/columns/date.common
 - drizzle-orm/pg-core/columns/double-precision
 - drizzle-orm/pg-core/columns/enum
 - drizzle-orm/pg-core/columns/inet
 - drizzle-orm/pg-core/columns/integer
 - drizzle-orm/pg-core/columns/interval
 - drizzle-orm/pg-core/columns/json
 - drizzle-orm/pg-core/columns/jsonb
 - drizzle-orm/pg-core/columns/macaddr
 - drizzle-orm/pg-core/columns/macaddr8
 - drizzle-orm/pg-core/columns/numeric
 - drizzle-orm/pg-core/columns/real
 - drizzle-orm/pg-core/columns/serial
 - drizzle-orm/pg-core/columns/smallint
 - drizzle-orm/pg-core/columns/smallserial
 - drizzle-orm/pg-core/columns/text
 - drizzle-orm/pg-core/columns/time
 - drizzle-orm/pg-core/columns/timestamp
 - drizzle-orm/pg-core/columns/uuid
 - drizzle-orm/pg-core/columns/varchar
 - drizzle-orm/pg-core/db
 - drizzle-orm/pg-core/dialect
 - drizzle-orm/pg-core/expressions
 - drizzle-orm/pg-core/foreign-keys
 - drizzle-orm/pg-core/indexes
 - drizzle-orm/pg-core/primary-keys
 - drizzle-orm/pg-core/query-builders
 - drizzle-orm/pg-core/query-builders/delete
 - drizzle-orm/pg-core/query-builders/insert
 - drizzle-orm/pg-core/query-builders/query
 - drizzle-orm/pg-core/query-builders/query-builder
 - drizzle-orm/pg-core/query-builders/refresh-materialized-view
 - drizzle-orm/pg-core/query-builders/select
 - drizzle-orm/pg-core/query-builders/select.types
 - drizzle-orm/pg-core/query-builders/update
 - drizzle-orm/pg-core/schema
 - drizzle-orm/pg-core/session
 - drizzle-orm/pg-core/subquery
 - drizzle-orm/pg-core/table
 - drizzle-orm/pg-core/unique-constraint
 - drizzle-orm/pg-core/utils
 - drizzle-orm/pg-core/utils/array
 - drizzle-orm/pg-core/view
 - drizzle-orm/pg-core/view-common
 - drizzle-orm/pg-proxy
 - drizzle-orm/pg-proxy/driver
 - drizzle-orm/pg-proxy/migrator
 - drizzle-orm/pg-proxy/session
 - drizzle-orm/planetscale-serverless
 - drizzle-orm/planetscale-serverless/driver
 - drizzle-orm/planetscale-serverless/migrator
 - drizzle-orm/planetscale-serverless/session
 - drizzle-orm/postgres-js
 - drizzle-orm/postgres-js/driver
 - drizzle-orm/postgres-js/migrator
 - drizzle-orm/postgres-js/session
 - drizzle-orm/primary-key
 - drizzle-orm/query-builders/query-builder
 - drizzle-orm/query-builders/select.types
 - drizzle-orm/query-promise
 - drizzle-orm/relations
 - drizzle-orm/runnable-query
 - drizzle-orm/session
 - drizzle-orm/sql
 - drizzle-orm/sql-js
 - drizzle-orm/sql-js/driver
 - drizzle-orm/sql-js/migrator
 - drizzle-orm/sql-js/session
 - drizzle-orm/sql/expressions
 - drizzle-orm/sql/expressions/conditions
 - drizzle-orm/sql/expressions/select
 - drizzle-orm/sql/sql
 - drizzle-orm/sqlite-core
 - drizzle-orm/sqlite-core/alias
 - drizzle-orm/sqlite-core/checks
 - drizzle-orm/sqlite-core/columns
 - drizzle-orm/sqlite-core/columns/blob
 - drizzle-orm/sqlite-core/columns/common
 - drizzle-orm/sqlite-core/columns/custom
 - drizzle-orm/sqlite-core/columns/integer
 - drizzle-orm/sqlite-core/columns/numeric
 - drizzle-orm/sqlite-core/columns/real
 - drizzle-orm/sqlite-core/columns/text
 - drizzle-orm/sqlite-core/db
 - drizzle-orm/sqlite-core/dialect
 - drizzle-orm/sqlite-core/expressions
 - drizzle-orm/sqlite-core/foreign-keys
 - drizzle-orm/sqlite-core/indexes
 - drizzle-orm/sqlite-core/primary-keys
 - drizzle-orm/sqlite-core/query-builders
 - drizzle-orm/sqlite-core/query-builders/delete
 - drizzle-orm/sqlite-core/query-builders/insert
 - drizzle-orm/sqlite-core/query-builders/query
 - drizzle-orm/sqlite-core/query-builders/query-builder
 - drizzle-orm/sqlite-core/query-builders/raw
 - drizzle-orm/sqlite-core/query-builders/select
 - drizzle-orm/sqlite-core/query-builders/select.types
 - drizzle-orm/sqlite-core/query-builders/update
 - drizzle-orm/sqlite-core/session
 - drizzle-orm/sqlite-core/subquery
 - drizzle-orm/sqlite-core/table
 - drizzle-orm/sqlite-core/unique-constraint
 - drizzle-orm/sqlite-core/utils
 - drizzle-orm/sqlite-core/view
 - drizzle-orm/sqlite-core/view-common
 - drizzle-orm/sqlite-proxy
 - drizzle-orm/sqlite-proxy/driver
 - drizzle-orm/sqlite-proxy/migrator
 - drizzle-orm/sqlite-proxy/session
 - drizzle-orm/subquery
 - drizzle-orm/table
 - drizzle-orm/tracing
 - drizzle-orm/utils
 - drizzle-orm/vercel-postgres
 - drizzle-orm/vercel-postgres/driver
 - drizzle-orm/vercel-postgres/migrator
 - drizzle-orm/vercel-postgres/session
 - drizzle-orm/version
 - drizzle-orm/view
 - drizzle-orm/view-common
 
Readme
Drizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a drizzle-kit CLI companion for automatic SQL migrations generation. Drizzle ORM is meant to be a library, not a framework. It stays as an opt-in solution all the time at any levels. The ORM's main philosophy is "If you know SQL, you know Drizzle ORM". We follow the SQL-like syntax whenever possible, are strongly typed ground up, and fail at compile time, not in runtime.
Drizzle ORM is being battle-tested on production projects by multiple teams 🚀 Give it a try and let us know if you have any questions or feedback on Discord.
Features
- Full type safety
 - Smart automated migrations generation
 - No ORM learning curve
 - SQL-like syntax for table definitions and queries
 - Best in class fully typed joins
 - Fully typed partial and non-partial selects of any complexity
 - Auto-inferring of TS types for DB models for selections and insertions separately
 - Zod schema generation
 - Zero dependencies
 
Documentation
Check the full documentation on the website
Supported databases
| Database | Support | ||
|---|---|---|---|
| PostgreSQL | ✅ | Docs | |
| MySQL | ✅ | Docs | |
| SQLite | ✅ | Docs | |
| Cloudflare D1 | ✅ | Docs | Website | 
| libSQL | ✅ | Docs | Website | 
| Turso | ✅ | Docs | Website | 
| PlanetScale | ✅ | Docs | Website | 
| Neon | ✅ | Docs | Website | 
| Vercel Postgres | ✅ | Docs | Website | 
| Supabase | ✅ | Docs | Website | 
| DynamoDB | ⏳ | ||
| MS SQL | ⏳ | ||
| CockroachDB | ⏳ | 
Our sponsors ❤️
Installation
npm install drizzle-orm
npm install -D drizzle-kitFeature showcase (PostgreSQL)
Note: don't forget to install
pgand@types/pgpackages for this example to work.
import { drizzle } from 'drizzle-orm/node-postgres';
import { integer, pgTable, serial, text, timestamp, varchar } from 'drizzle-orm/pg-core';
import { InferModel, eq, sql } from 'drizzle-orm';
import { Pool } from 'pg';
export const users = pgTable('users', {
  id: serial('id').primaryKey(),
  fullName: text('full_name').notNull(),
  phone: varchar('phone', { length: 20 }).notNull(),
  role: text('role', { enum: ['user', 'admin'] }).default('user').notNull(),
  cityId: integer('city_id').references(() => cities.id),
  createdAt: timestamp('created_at').defaultNow().notNull(),
  updatedAt: timestamp('updated_at').defaultNow().notNull(),
});
export type User = InferModel<typeof users>;
export type NewUser = InferModel<typeof users, 'insert'>;
export const cities = pgTable('cities', {
  id: serial('id').primaryKey(),
  name: text('name').notNull(),
});
export type City = InferModel<typeof cities>;
export type NewCity = InferModel<typeof cities, 'insert'>;
const pool = new Pool({
  connectionString: 'postgres://user:password@host:port/db',
});
const db = drizzle(pool);
// Insert
const newUser: NewUser = {
  fullName: 'John Doe',
  phone: '+123456789',
};
const insertedUsers /* : User[] */ = await db.insert(users).values(newUser).returning();
const insertedUser = insertedUsers[0]!;
const newCity: NewCity = {
  name: 'New York',
};
const insertedCities /* : City[] */ = await db.insert(cities).values(newCity).returning();
const insertedCity = insertedCities[0]!;
// Update
const updateResult /* : { updated: Date }[] */ = await db.update(users)
  .set({ cityId: insertedCity.id, updatedAt: new Date() })
  .where(eq(users.id, insertedUser.id))
  .returning({ updated: users.updatedAt });
// Select
const allUsers /* : User[] */ = await db.select().from(users);
// Select custom fields
const upperCaseNames /* : { id: number; name: string }[] */ = await db
  .select({
    id: users.id,
    name: sql<string>`upper(${users.fullName})`,
  })
  .from(users);
// Joins
// You wouldn't BELIEVE how SMART the result type is! 😱
const allUsersWithCities = await db
  .select({
    id: users.id,
    name: users.fullName,
    city: {
      id: cities.id,
      name: cities.name,
    },
  })
  .from(users)
  .leftJoin(cities, eq(users.cityId, cities.id));
// Delete
const deletedNames /* : { name: string }[] */ = await db.delete(users)
  .where(eq(users.id, insertedUser.id))
  .returning({ name: users.fullName });See full docs for further reference: