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-kit
Feature showcase (PostgreSQL)
Note: don't forget to install
pg
and@types/pg
packages 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: