Drizzle ORM 0.21.0 was released 🎉
- Added support for new migration folder structure and breakpoints feature, described in drizzle-kit release section
- Fix
onUpdateNow()
expression generation for default migration statement
Support for PostgreSQL array types
export const salEmp = pgTable('sal_emp', {
name: text('name').notNull(),
payByQuarter: integer('pay_by_quarter').array(),
schedule: text('schedule').array().array(),
});
export const tictactoe = pgTable('tictactoe', {
squares: integer('squares').array(3).array(3),
});
drizzle kit will generate
CREATE TABLE sal_emp (
name text,
pay_by_quarter integer[],
schedule text[][]
);
CREATE TABLE tictactoe (
squares integer[3][3]
);
Added composite primary key support to PostgreSQL and MySQL
PostgreSQL
import { primaryKey } from 'drizzle-orm/pg-core';
export const cpkTable = pgTable('table', {
column1: integer('column1').default(10).notNull(),
column2: integer('column2'),
column3: integer('column3'),
}, (table) => ({
cpk: primaryKey(table.column1, table.column2),
}));
MySQL
import { primaryKey } from 'drizzle-orm/mysql-core';
export const cpkTable = mysqlTable('table', {
simple: int('simple'),
columnNotNull: int('column_not_null').notNull(),
columnDefault: int('column_default').default(100),
}, (table) => ({
cpk: primaryKey(table.simple, table.columnDefault),
}));
Drizzle Kit 0.17.0 was released 🎉
Breaking changes
Folder structure was migrated to newer version
Before running any new migrations drizzle-kit
will ask you to upgrade in a first place
Migration file structure < 0.17.0
📦 <project root>
└ 📂 migrations
└ 📂 20221207174503
├ 📜 migration.sql
├ 📜 snapshot.json
└ 📂 20230101104503
├ 📜 migration.sql
├ 📜 snapshot.json
Migration file structure >= 0.17.0
📦 <project root>
└ 📂 migrations
└ 📂 meta
├ 📜 _journal.json
├ 📜 0000_snapshot.json
├ 📜 0001_snapshot.json
└ 📜 0000_icy_stranger.sql
└ 📜 0001_strange_avengers.sql
Upgrading to 0.17.0
To easily migrate from previous folder structure to new you need to run up
command in drizzle kit. It's a great helper to upgrade your migrations to new format on each drizzle kit major update
drizzle-kit up:<dialect> # dialects: `pg`, `mysql`, `sqlite`
# example for pg
drizzle-kit up:pg
New Features
New drizzle-kit
command called drop
In a case you think some of migrations were generated in a wrong way or you have made migration simultaneously with other developers you can easily rollback it by running simple command
Warning:
Make sure you are dropping migrations that were not applied to your database
drizzle-kit drop
This command will show you a list of all migrations you have and you'll need just to choose migration you want to drop. After that drizzle-kit
will do all the hard work on deleting migration files
New drizzle-kit
option --breakpoints
for generate
and introspect
commands
If particular driver doesn't support running multiple quries in 1 execution you can use --breakpoints
.
drizzle-kit
will generate current sql
CREATE TABLE `users` (
`id` int PRIMARY KEY NOT NULL,
`full_name` text NOT NULL,
);
--> statement-breakpoint
CREATE TABLE `table` (
`id` int PRIMARY KEY NOT NULL,
`phone` int,
);
Using it drizzle-orm
will split all sql files by statements and execute them separately
Add drizzle-kit introspect
for MySQL dialect
You can introspect your mysql database using introspect:mysql
command
drizzle-kit introspect:mysql --out ./migrations --connectionString mysql://user:password@127.0.0.1:3306/database
Support for glob patterns for schema path
Usage example in cli
drizzle-kit generate:pg --out ./migrations --schema ./core/**/*.ts ./database/schema.ts
Usage example in drizzle.config
{
"out: "./migrations",
"schema": ["./core/**/*.ts", "./database/schema.ts"]
}
Bug Fixes and improvements
Postgres dialect
GitHub issue fixes
- [pg] char is undefined during introspection #9
- when unknown type is detected, would be nice to emit a TODO comment instead of undefined #8
- "post_id" integer DEFAULT currval('posts_id_seq'::regclass) generates invalid TS #7
- "ip" INET NOT NULL is not supported #6
- "id" UUID NOT NULL DEFAULT uuid_generate_v4() type is not supported #5
- array fields end up as "undefined" in the schema #4
- timestamp is not in the import statement in schema.ts #3
- generated enums are not camel cased #2
Introspect improvements
- Add support for composite PK's generation;
- Add support for
cidr
,inet
,macaddr
,macaddr8
,smallserial
- Add interval fields generation in schema, such as
minute to second
,day to hour
, etc. - Add default values for
numerics
- Add default values for
enums
MySQL dialect
Migration generation improvements
- Add
autoincrement
create, delete and update handling - Add
on update current_timestamp
handling for timestamps - Add data type changing, using
modify
- Add
not null
changing, usingmodify
- Add
default
drop and create statements - Fix
defaults
generation bugs, such as escaping, date strings, expressions, etc
Introspect improvements
- Add
autoincrement
to all supported types - Add
fsp
for time based data types - Add precision and scale for
double
- Make time
{ mode: "string" }
by default - Add defaults to
json
,decimal
andbinary
datatypes - Add
enum
data type generation