2016-05-10 5 views
6

Ich habe seit über einer Stunde mit der db:seed:all gekämpft und langsam verliere ich meine Meinung darüber.Sequelize-CLI Seeders - Kann die Eigenschaft von undefined nicht lesen

Ich habe ein einfaches Modell:

'use strict'; 
module.exports = function (sequelize, DataTypes) { 
    var Car = sequelize.define('Cars', { 
    name: DataTypes.STRING, 
    type: DataTypes.INTEGER, 
    models: DataTypes.INTEGER 
    }, { 
     classMethods: { 
     associate: function (models) { 
      // associations can be defined here 
     } 
     } 
    }); 
    return Car; 
}; 

dies in einer Migration ist und geht in die Datenbank sequelize db:migrate mit der gut arbeitet.

Als nächstes wollte ich - durch eine Seed-Datei - 2 Autos einfügen. Also lief ich den Befehl sequelize seed:create --name insertCars und hinzugefügt, um die bulkInsert:

'use strict'; 

module.exports = { 
    up: function (queryInterface, Sequelize) { 
    return queryInterface.bulkInsert(
     'Cars', 
     [ 
     { 
      name: "Auris", 
      type: 1, 
      models: 500, 
      createdAt: Date.now(), updatedAt: Date.now() 
     }, 
     { 
      name: "Yaris", 
      type: 1, 
      models: 500, 
      createdAt: Date.now(), updatedAt: Date.now() 
     } 
     ] 
    ); 
    }, 

    down: function (queryInterface, Sequelize) { 
    } 
}; 

Nun, wenn ich sequelize db:seed:all betreibe ich folgende Fehlermeldung erhalten:

Loaded configuration file "config\config.json". 
Using environment "development". 
== 20160510132128-insertCars: migrating ======= 
Seed file failed with error: Cannot read property 'name' of undefined 

Hat mit dem Ausführen dieser seeders keine Erfahrung jemand hat? Zu Ihrer Information hier meine Config-Datei ist:

{ 
    "development": { 
    "username": "mydbdude", 
    "password": "mydbdude", 
    "database": "Cars", 
    "host": "127.0.0.1", 
    "dialect": "mssql", 
    "development": { 
     "autoMigrateOldSchema": true 
    } 
    }, 
    ....other configs 
} 

EDIT: Ausgabe von db: wandern

Sequelize [Node: 5.9.1, CLI: 2.4.0, ORM: 3.23.0] 

Loaded configuration file "config\config.json". 
Using environment "development". 
No migrations were executed, database schema was already up to date. 
+0

Hallo, können Sie die Terminalausgabe von 'sequelize db: migrate' zeigen? – paolord

+0

@paolord Ich habe meine ursprüngliche Frage editiert und die Ausgabe von db hinzugefügt: migrate an der Unterseite – Tikkes

+0

Welchen DB-Dialekt benutzen Sie? Ich hatte Probleme mit Postgres und Groß-und Kleinschreibung Namen (dh. "Autos" vs die 'Autos' Tabelle Postgres erstellt) –

Antwort

0

Da ich noch nicht in der Lage gewesen, diese Funktion zu erhalten, ich, jetzt dann, post meine lösung habe ich benutzt das funktioniert eher gut aber ist custom built.

Zuerst habe ich eine JSON-Datei erstellt, die das Objekt enthält, das ich säen möchte. dh

dataSources: [ 
    { 
     name: 'Pattern' 
    }, 
    { 
     name: 'Upload' 
    } 
] 

Als nächstes ich einen seeder.js in der Server-Seite meiner Anwendung implementiert haben, ist die folgende (getrimmten Version natürlich)

var models = require('./../models'), 
sql = models.sequelize, 
Promise = models.Sequelize.Promise; 

var objects = require('./seed/objects'), //this is where my object file is 
dataSources = objects.dataSources; 


var express = require('express'); 

var seedDatabase = function() { 
    var promises = []; 
    promises.push(createDataSources()); 
    //more can be added to the promises 

    return Promise.all(promises); 
}; 

function createDataSources() { 
    return models.sequelize 
     .transaction(
      { 
       isolationLevel: models.sequelize.Transaction.ISOLATION_LEVELS.READ_COMMITTED 
      }, 
      function (t) { 
       return models.DataSource 
        .findAll({ 
         attributes: [ 
          'id' 
         ] 
        }) 
        .then(function (result) { 
         if (!result || result.length == 0) { 
          return models.DataSource 
           .bulkCreate(dataSources, { transaction: t }) 
           .then(function() { 
            console.log("DataSources created"); 
           }) 
         } 
         else { 
          console.log("DataSources seeder skipped, already objects in the database..."); 
          return; 
         } 
        }); 
      }) 
     .then(function (result) { 
      console.log("DataSources seeder finished..."); 
      return; 
     }) 
     .catch(function (error) { 
      console.log("DataSources seeder exited with error: " + error.message); 
      return; 
     }); 
}; 

module.exports = { 
    seedDatabase: seedDatabase 
} 

Nun sind alle diese Einstellungen abgeschlossen enthält, kann ich diese verwenden seedDatabase Funktion, wenn meine Anwendung anfängt, damit mein seeder zu laufen, etwa so:

//includes and routes above, not interesting for this answer 
try { 
    umzug.up().then(function (migrations) { 
     for (var i = 0; i < migrations.length; i++) { 
      console.log("Migration executed: " + migrations[i].file); 
     } 

     console.log("Running seeder"); 
     seeder.seedDatabase().then(function() { //here I run my seeders 
      app.listen(app.get('port'), function() { 
       console.log('Express server listening on port ' + app.get('port')); 
      }); 
     }); 
    }); 
} 
catch (e) { 
    console.error(e); 
} 

das ist es, jetzt, wenn Sie Wenn Sie Ihre Anwendung ausführen, überprüft der Seeder die Datenbank, ob eines Ihrer Objekte bereits in die Datenbank eingefügt wurde. Wenn dies der Fall ist, wird die Sämaschine übersprungen, wenn nicht, werden sie eingefügt.

Ich hoffe, dass Ihnen das helfen wird.

Verwandte Themen