Files
drizzle-team--drizzle-orm/changelogs/drizzle-orm/0.21.0.md
T
2026-07-13 12:10:05 +08:00

243 lines
6.3 KiB
Markdown

## 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
</br>
### Support for PostgreSQL array types
---
```ts
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
```sql
CREATE TABLE sal_emp (
name text,
pay_by_quarter integer[],
schedule text[][]
);
CREATE TABLE tictactoe (
squares integer[3][3]
);
```
</br>
### Added composite primary key support to PostgreSQL and MySQL
---
PostgreSQL
```ts
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
```ts
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
```plaintext
📦 <project root>
└ 📂 migrations
└ 📂 20221207174503
├ 📜 migration.sql
├ 📜 snapshot.json
└ 📂 20230101104503
├ 📜 migration.sql
├ 📜 snapshot.json
```
Migration file structure >= 0.17.0
```plaintext
📦 <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
---
![](/changelogs/media/up_mysql.gif)
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
```bash
drizzle-kit up:<dialect> # dialects: `pg`, `mysql`, `sqlite`
# example for pg
drizzle-kit up:pg
```
</br>
## New Features
### New `drizzle-kit` command called `drop`
</br>
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
```bash
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
![](/changelogs/media/drop.gif)
</br>
### 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
```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
</br>
### Add `drizzle-kit introspect` for MySQL dialect
You can introspect your mysql database using `introspect:mysql` command
```bash
drizzle-kit introspect:mysql --out ./migrations --connectionString mysql://user:password@127.0.0.1:3306/database
```
![](/changelogs/media/introspect_mysql.gif)
</br>
### Support for glob patterns for schema path
Usage example in `cli`
```bash
drizzle-kit generate:pg --out ./migrations --schema ./core/**/*.ts ./database/schema.ts
```
Usage example in `drizzle.config`
```text
{
"out: "./migrations",
"schema": ["./core/**/*.ts", "./database/schema.ts"]
}
```
## Bug Fixes and improvements
### Postgres dialect
---
**GitHub issue fixes**
- [pg] char is undefined during introspection [#9](https://github.com/drizzle-team/drizzle-kit-mirror/issues/9)
- when unknown type is detected, would be nice to emit a TODO comment instead of undefined [#8](https://github.com/drizzle-team/drizzle-kit-mirror/issues/8)
- "post_id" integer DEFAULT currval('posts_id_seq'::regclass) generates invalid TS [#7](https://github.com/drizzle-team/drizzle-kit-mirror/issues/7)
- "ip" INET NOT NULL is not supported [#6](https://github.com/drizzle-team/drizzle-kit-mirror/issues/6)
- "id" UUID NOT NULL DEFAULT uuid_generate_v4() type is not supported [#5](https://github.com/drizzle-team/drizzle-kit-mirror/issues/5)
- array fields end up as "undefined" in the schema [#4](https://github.com/drizzle-team/drizzle-kit-mirror/issues/4)
- timestamp is not in the import statement in schema.ts [#3](https://github.com/drizzle-team/drizzle-kit-mirror/issues/3)
- generated enums are not camel cased [#2](https://github.com/drizzle-team/drizzle-kit-mirror/issues/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, using `modify`
- 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` and `binary` datatypes
- Add `enum` data type generation