72 lines
2.3 KiB
Markdown
72 lines
2.3 KiB
Markdown
# Migration
|
|
## Schemas migration
|
|
Migrations are just manually written `*.sql` files that represent the database schemas.
|
|
Each file is executed one after the other in alphabetical order.
|
|
Each execution is stored in the `migration.history` table.
|
|
|
|
A migration contains a `*.up.sql` file and a `*.down.sql` file to rollback the migration.
|
|
The content of the `*.down.sql` file is also stored in the database.
|
|
This allows the `*.down.sql` to be executed even if the code is already rollback.
|
|
|
|
Example:
|
|
```postgresql
|
|
-- resources/sql/migrations/0000-init_schema.up.sql
|
|
create table "user"
|
|
(
|
|
id uuid default uuid_generate_v4() not null primary key,
|
|
created_at timestamptz default now() not null,
|
|
blocked_at timestamptz default null null,
|
|
username varchar(64) not null check ( username != '' and lower(username) = username) unique,
|
|
password text not null check ( password != '' ),
|
|
roles text[] default '{}' not null
|
|
);
|
|
```
|
|
|
|
```postgresql
|
|
-- resources/sql/migrations/0000-init_schema.down.sql
|
|
drop table if exists "user";
|
|
```
|
|
## Stored procedure migrations
|
|
|
|
Migrations are also stored procedures and other functions.
|
|
Each function is updated with each migration.
|
|
|
|
Example:
|
|
```postgresql
|
|
-- resources/sql/functions/insert_user.sql
|
|
create or replace function insert_user(inout resource json) language plpgsql as
|
|
$$
|
|
declare
|
|
new_id uuid;
|
|
begin
|
|
insert into "user" (id, username, password, blocked_at, roles)
|
|
select
|
|
coalesce(t.id, uuid_generate_v4()),
|
|
t.username,
|
|
crypt(resource->>'password', gen_salt('bf', 8)),
|
|
case when t.blocked_at is not null then now() else null end,
|
|
t.roles
|
|
from json_populate_record(null::"user", resource) t
|
|
returning id into new_id;
|
|
|
|
select find_user_by_id(new_id) into resource;
|
|
end;
|
|
$$;
|
|
```
|
|
|
|
```postgresql
|
|
-- resources/sql/functions/find_user_by_id.sql
|
|
create or replace function find_user_by_id(in _id uuid, out resource json) language plpgsql as
|
|
$$
|
|
begin
|
|
select to_jsonb(u) - 'password' into resource
|
|
from "user" as u
|
|
where u.id = _id;
|
|
end;
|
|
$$;
|
|
```
|
|
|
|
* [Execute migrations in application](./migrations-application.md)
|
|
* [Execute migrations with gradle](./migrations-gradle.md)
|
|
|