具有唯一约束函数的Knex.js迁移

时间:2017-08-21 23:19:54

标签: mysql api express migration knex.js

我目前正在尝试将新表格迁移到我的数据库中。该表是users表。这是我的代码:

exports.up = function(knex, Promise) {
  return knex.schema.createTableIfNotExists('users', function(table) {
    table.increments('id').primary();
    table.string('first_name').notNullable();
    table.string('last_name').notNullable();
    table.string('email').unique().notNullable();
    table.string('password').notNullable();
    table.timestamps(false, true);
  }).then(() => {
    console.log('Users Table is Created!');
  })
};

exports.down = function(knex, Promies) {
  return knex.schema.dropTable('users')
    .then(() => {
      console.log('Users Table has been Dropped!');
    })
};

这会返回两个错误:

Knex:warning - migrations failed with error: alter tableusersadd uniqueusers_email_unique(email) - Key column 'email' doesn't exist in table

Error: Key column 'email' doesn't exist in table

似乎unique()尝试做的是在我正在尝试创建的表上执行alter table。因此,电子邮件列不存在的错误。我在这里做错了什么,或者你在创建表时不能在列上执行unique()函数?我看到了在docs上的createTable中使用unique()函数的示例。所以我不知道为什么会对这个错误作出反应。

我的数据库正在创建,我可以看到它。只是看起来unique()约束未应用于未创建的电子邮件列。

2 个答案:

答案 0 :(得分:1)

knex.schema.createTableIfNotExists('users', function(table) {
    table.increments('id').primary();
    table.string('first_name').notNullable();
    table.string('last_name').notNullable();
    table.string('email').unique().notNullable();
    table.string('password').notNullable();
    table.timestamps(false, true);
  }).toSQL().forEach(query => console.log(query.sql))

创建以下SQL

create table if not exists "users" ("id" serial primary key, "first_name" varchar(255) not null, "last_name" varchar(255) not null, "email" varchar(255) not null, "password" varchar(255) not null, "created_at" timestamptz not null default CURRENT_TIMESTAMP, "updated_at" timestamptz not null default CURRENT_TIMESTAMP);
alter table "users" add constraint "users_email_unique" unique ("email");

因此,如果表已经具有该名称的约束,则创建查询的约束将失败。但是你的错误似乎确实提到了其他一些奇怪的情况。

答案 1 :(得分:0)

事实证明我需要删除所有表并重新运行我的迁移。这就是为什么它不起作用以及为什么我认为它试图执行alter table