如何在 Knex 迁移中设置默认值?

How to set a default value in Knex migration?

我想在 Knex 迁移中为主键设置默认值,但我 运行 遇到了问题。这是我的初始迁移:

exports.up = (knex, Promise) => {
  return knex.schema.createTable(
    'users',
    (table) => {
      table.uuid('id').primary();
      table.string('email');
    }
  );
};

我想将 id 字段默认为随机 UUID。所以这是我的下一次迁移:

exports.up = (knex, Promise) => {
  return Promise.all([
    knex.raw('create extension if not exists "uuid-ossp"'),
    knex.schema.alterTable('users', (table) => {
      table.uuid('id')
        .defaultTo(knex.raw('uuid_generate_v4()'))
        .alter();
    }),
  ]);
};

当我 运行 出现以下错误时:

migration failed with error: alter table "users" alter column "id" drop not null - column "id" is in a primary key

基于此,Knex 似乎正试图取消 NOT NULL 约束。我尝试在 .defaultTo() 之前链接 .notNullable(),它仍然给出相同的错误。我做错了什么吗?

您需要删除主键,更改列,然后重新创建它。

这是一个快速 copy/paste 答案,供那些来这里搜索“如何在 Knex 迁移中设置默认值”的人使用

table.string('state').notNullable().defaultTo('pending')

注意:notNullable() 不是必需的。