Миграции
Миграция — это файл с описанием изменения структуры базы: создать таблицу, добавить столбец, удалить индекс. Миграции хранятся в проекте вместе с кодом, поэтому у каждого разработчика и на сервере база получается одинаковой. Это то же, что миграции в Laravel.
Создание миграции
node ace make:migration postsВ папке database/migrations/ появится файл вида 1727950000000_create_posts_table.ts. Число в начале — время создания: по нему миграции выполняются по порядку.
Описание таблицы
Откройте файл и опишите столбцы статьи:
// database/migrations/1727950000000_create_posts_table.ts
import { BaseSchema } from '@adonisjs/lucid/schema'
export default class extends BaseSchema {
protected tableName = 'posts'
async up() {
this.schema.createTable(this.tableName, (table) => {
table.increments('id')
table.string('title').notNullable()
table.text('body').notNullable()
table.boolean('is_published').defaultTo(false)
table.timestamp('created_at')
table.timestamp('updated_at')
})
}
async down() {
this.schema.dropTable(this.tableName)
}
}Метод up применяет изменение, down отменяет его. Имена столбцов в базе пишут в snake_case.
Типы столбцов
| Метод | Столбец |
|---|---|
increments('id') | Автоинкрементный первичный ключ |
string('title') | Строка до 255 символов |
text('body') | Длинный текст |
integer('views') | Целое число |
boolean('is_published') | Да или нет |
timestamp('created_at') | Дата и время |
Модификаторы дописывают цепочкой: notNullable(), nullable(), defaultTo(0), unique().
Запуск
node ace migration:runLucid выполнит up у всех новых миграций и запишет их в служебную таблицу adonis_schema. В терминале появится строка migrated database/migrations/..._create_posts_table.
| Команда | Что делает |
|---|---|
migration:run | Применяет новые миграции |
migration:rollback | Откатывает последнюю партию |
migration:status | Показывает, какие миграции применены |
migration:fresh | Удаляет все таблицы и применяет миграции заново |
Изменение таблицы
Чтобы добавить столбец в существующую таблицу, создайте новую миграцию и используйте alterTable:
node ace make:migration add_slug_to_posts// database/migrations/1727960000000_add_slug_to_posts.ts
import { BaseSchema } from '@adonisjs/lucid/schema'
export default class extends BaseSchema {
protected tableName = 'posts'
async up() {
this.schema.alterTable(this.tableName, (table) => {
table.string('slug').nullable().unique()
})
}
async down() {
this.schema.alterTable(this.tableName, (table) => {
table.dropColumn('slug')
})
}
}После node ace migration:run в таблице posts появится столбец slug.
Частая ошибка
Правка уже применённой миграции ничего не меняет: Lucid видит её в adonis_schema и не запускает снова. Пока проект только у вас, можно откатить её через migration:rollback, исправить и применить ещё раз. Если миграция уже ушла на сервер или к коллегам, не трогайте её, а создайте новую.