2016-05-10 2 views
6

Я боюсь с db:seed:all более часа, и медленно я теряю рассудок об этом.Sequelize-CLI Seeders - Не могу прочитать свойство undefined

У меня есть простая модель:

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

это в миграции и отправляется в базу данных с помощью sequelize db:migrate, которая работает отлично.

Далее я хотел вставить - через файл семян - 2 машины. Так что я выполнил команду sequelize seed:create --name insertCars и добавил 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) { 
    } 
}; 

Теперь, когда я бегу sequelize db:seed:all я получаю следующее сообщение об ошибке:

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

Кто-нибудь есть опыт работы с выполнения этих сеялок? Для вашей информации здесь мой конфигурационный файл:

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

EDIT: Вывод из БД: мигрировать

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

Привет, можете ли вы показать вывод терминала 'sequelize db: migrate'? – paolord

+0

@paolord Я отредактировал свой оригинальный вопрос и добавил вывод из db: migrate внизу – Tikkes

+0

какой диалект DB вы используете? У меня были проблемы с Postgres и именами, чувствительными к регистру (т. Е. 'Cars' по сравнению с таблицами postgres' cars' создает) –

ответ

0

Поскольку я до сих пор не удалось получить эту работу, я, теперь то, отправьте мое решение, которое я использовал, который работает довольно хорошо, но настраивается на заказ.

Во-первых, я создал файл JSON, содержащий объект, который я хочу засеять. т.е.

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

Далее я реализовал seeder.js на стороне сервера моего приложения, содержащего следующую (обрезанную версию, конечно)

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 
} 

Теперь эта установка делается, я могу использовать это seedDatabase функция, когда мое приложение запускается для того, чтобы запустить свою сеялку, например, так:

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

Вот, теперь, когда ты запустите приложение, сеялка проверит базу данных, если какой-либо из ваших объектов уже вставлен в базу данных. Если это так, сеялка пропущена, если нет, они вставлены.

Надеюсь, это поможет вам, ребята.