2017-08-21 2 views
2

Ich versuche gerade, eine neue Tabelle in meine Datenbank zu migrieren. Diese Tabelle ist die Benutzertabelle. Hier ist der Code, den ich habe:Knex.js Migrationen mit eindeutiger Einschränkungsfunktion

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!'); 
    }) 
}; 

Dies gibt die zwei Fehler:

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

Es scheint, dass das, was unique() versucht, ein alter table zu tun ist, die Vorform auf eine Tabelle, die ich erstellen möchte. Daher der Fehler, dass die E-Mail-Spalte nicht existiert. Mache ich hier etwas falsch oder kann die unique() Funktion in einer Spalte beim Erstellen einer Tabelle nicht ausgeführt werden? Ich habe Beispiele für die Verwendung der Funktion unique() in einer createTable in den Dokumenten gesehen. Ich weiß also nicht, warum das mit diesem Fehler reagieren würde.

Meine Datenbank wird erstellt und ich kann es sehen. Es scheint nur, dass die Bedingung unique() nicht auf die E-Mail-Spalte angewendet wird, die auch nicht erstellt wird.

Antwort

0

So stellt sich heraus, dass ich alle Tabellen löschen und meine Migration erneut ausführen muss. Deshalb hat es nicht funktioniert und warum ich denke, dass es versucht hat, eine alter table durchzuführen.

0
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)) 

erstellt SQL folgende

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"); 

Also, wenn Tabelle bereits die Einschränkung mit diesem Namen wird es scheitern die Einschränkung der Erstellung Abfrage. Aber Ihr Fehler scheint sich auf eine andere seltsame Situation zu beziehen.