我目前正在尝试将新表格迁移到我的数据库中。该表是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()
约束未应用于未创建的电子邮件列。
答案 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
。