243 lines
6.3 KiB
Markdown
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
|
|
|
|
---
|
|
|
|

|
|
|
|
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
|
|
|
|

|
|
|
|
</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
|
|
```
|
|
|
|

|
|
|
|
</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
|