Drizzle ORM in late 2026: 0.45 stable, 1.0 RC with Relational Queries v2 and new migration folders
Drizzle ORM in late 2026: 0.45 stable, 1.0 RC with Relational Queries v2 and new migration folders
Stable Drizzle is still 0.45.x (0.45.3, 2026-09-21); 1.0 is at rc.4. v1 replaces relations()/db._query with defineRelations + object where/orderBy, rewrites drizzle-kit and the migrations folder layout, and moves casing onto tables.
Drizzle ORM: 0.45 stable vs 1.0 RC (2026)
As of: 2026-10
Versions
- npm
latest:drizzle-orm@0.45.3(2026-09-21) anddrizzle-kit@0.31.11(2026-09-21). - npm
rc:1.0.0-rc.4(GitHub release 2026-06-27). The 1.0 line started with1.0.0-beta.1(2025-11-03);beta.2(2025-12-02) added MSSQL and CockroachDB dialects. npm i drizzle-ormstill installs 0.45. To use v1:npm i drizzle-orm@rcandnpm i -D drizzle-kit@rc.
What changes in v1 (what older training data gets wrong)
Relational Queries v2 (RQBv2). Per-table relations() objects and drizzle(url, { schema }) are replaced by one defineRelations call passed as relations:
import { defineRelations } from "drizzle-orm";
import * as schema from "./schema";
export const relations = defineRelations(schema, (r) => ({
users: { posts: r.many.posts() },
posts: { author: r.one.users({ from: r.posts.authorId, to: r.users.id }) },
}));
const db = drizzle(process.env.DATABASE_URL!, { relations });
whereandorderByindb.query.*.findManyare objects now:where: { id: 1 },orderBy: { id: "asc" }(previously callbacks such as(u, { eq }) => eq(u.id, 1)).- Many-to-many uses
.through():from: r.users.id.through(r.usersToGroups.userId). relationNameis renamed toalias. The MySQLmodeoption ondrizzle()is gone.- During the betas the old API lived on as
db._query.rc.1removed it for Postgres andrc.4removed it for SQLite. If you are on the RC, port everything to RQBv2. drizzle-kit pullgenerates arelations.tsin v2 syntax, which you can use as a starting point.
Casing API (breaking in rc.1). drizzle({ casing: "snake_case" }) is replaced by per-table, per-view and per-schema helpers:
import * as d from "drizzle-orm/pg-core";
export const users = d.snakeCase.table("users", { fullName: d.text() }); // full_name
drizzle-kit rewrite and migration folders. journal.json is gone. Each migration now has its own folder holding its SQL and snapshot, and drizzle-kit drop was removed. Existing projects must run npx drizzle-kit up once to convert the folder. schemaFilter now manages every schema defined in code, not only public, and it accepts globs. drizzle-kit pull --init marks the pulled baseline as applied. pgTable(...).enableRLS() is replaced by pgTable.withRLS(...).
Other RC changes. Opt-in JIT row mappers (drizzle({ ..., jit: true })). A codec system normalizes driver differences on pg, mysql and sqlite. pg array utilities moved to drizzle-orm/pg-core/array. Effect integration now targets Effect v4 beta.
rc.4 tooling. drizzle-kit commands accept --output json and non-interactive --hints. A programmatic SDK is available at drizzle-kit/cli, and there is an MCP server (drizzle-kit mcp).
What to do now
- For production, stay on 0.45.x unless you accept RC risk. Write new 0.45 code with the v1 API in mind.
- When moving to v1, upgrade both packages together. Then run
drizzle-kit up, port your relations and queries to RQBv2, and replacecasingwithsnakeCase.table/camelCase.table. - Check that an RC upgrade works by running your relational queries. Type errors from
db._queryshow what still needs porting.
Sources
- https://github.com/drizzle-team/drizzle-orm/releases/tag/0.45.3
- https://github.com/drizzle-team/drizzle-orm/releases/tag/v1.0.0-beta.2
- https://github.com/drizzle-team/drizzle-orm/releases/tag/v1.0.0-rc.1
- https://github.com/drizzle-team/drizzle-orm/releases/tag/v1.0.0-rc.4
- https://orm.drizzle.team/docs/upgrade-v1
- https://orm.drizzle.team/docs/relations-v1-v2