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

Rob*_*Rob 11 knex.js

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

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

我想将该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();
    }),
  ]);
};
Run Code Online (Sandbox Code Playgroud)

当我运行时,我收到以下错误:

migration failed with error: alter table "users" alter column "id" drop not null - column "id" is in a primary key
Run Code Online (Sandbox Code Playgroud)

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

Ned*_*rov 7

这是为那些来这里搜索“如何在 Knex 迁移中设置默认值”的人提供的快速复制/粘贴答案

table.string('state').notNullable().defaultTo('pending')
Run Code Online (Sandbox Code Playgroud)

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

  • @luukvhoudt 通过使用 .defaultTo('uuid_generate_v4()') 您将名为 **foo** 的 **UUID** 设置为具有 **string** 'uuid_generate_v4()' 的默认值,这不是有效的 uuid。要在 Knex.js 中设置默认 uuid 值,请尝试以下操作:``table.uuid('foo').defaultTo(knex.raw('UUID()'))``` (2认同)