2016-05-10 12 views
6

Ho lottato con il db:seed:all per più di un'ora e lentamente sto perdendo la testa su questo.Sequelize-CLI Seeders - Impossibile leggere la proprietà di undefined

Ho un modello semplice:

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

questo è in una migrazione e va al database utilizzando sequelize db:migrate che funziona bene.

Successivamente ho voluto inserire, tramite un file seme, 2 macchine. così mi sono imbattuto il comando sequelize seed:create --name insertCars e ha aggiunto il 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) { 
    } 
}; 

Ora quando corro sequelize db:seed:all ottengo l'errore seguente:

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

Qualcuno ha alcuna esperienza con l'esecuzione di questi seminatrici? Per vostra informazione ecco il mio file di configurazione:

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

EDIT: Uscita da db: migrate

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

Ciao, puoi mostrare l'output del terminale di 'sequelize db: migrate'? – paolord

+0

@paolord I ha editato la mia domanda originale e aggiunto l'output da db: migrate in basso – Tikkes

+0

quale dialetto DB state usando? Ho riscontrato problemi con Postgres e nomi sensibili alle maiuscole e minuscole (ad esempio, 'Cars' contro la tabella' cars' che postgres crea) –

risposta

0

Dal momento che ancora non sono stati in grado di ottenere questo lavoro, io, ora poi, Ho pubblicato la mia soluzione che ho usato che funziona piuttosto bene ma è costruita su misura.

In primo luogo, ho creato un file JSON contenente l'oggetto che voglio seminare. cioè

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

Avanti, ho implementato un seeder.js nel lato server della mia applicazione contenente le seguenti (versione tagliata ovviamente)

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 
} 

Ora tutto questo setup è stato fatto, posso usare questo seedDatabase funzione quando la mia applicazione si avvia al fine di eseguire il mio seminatrice, in questo modo:

//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); 
} 

Questo è tutto, ora, quando si esegui la tua applicazione, la seminatrice controllerà il database se qualcuno dei tuoi oggetti è già inserito nel database. Se è così, la seminatrice viene saltata, in caso contrario, vengono inseriti.

Spero che questo ti possa aiutare.

Problemi correlati