6

我已经为此苦苦挣扎db:seed:all了一个多小时,慢慢地我对此失去了理智。

我有一个简单的模型:

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

编辑:来自 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.
4

2 回答 2

3

由于我仍然无法使其正常工作,因此我现在发布我使用的解决方案,该解决方案效果很好,但是是定制的。

首先,我创建了一个 JSON 文件,其中包含我想要播种的对象。IE

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

就是这样,现在,当您运行应用程序时,播种器将检查数据库是否已将任何对象插入到数据库中。如果是,则跳过播种器,如果不是,则插入它们。

我希望这会对你们有所帮助。

于 2016-09-21T06:41:43.963 回答
0

我有同样的问题,问题是我在对象之间添加了额外的逗号,检查任何可能有效的语法错误

 dataSources: [
    {
        name: 'Pattern'
    },
    ,// this comma was added by mistake for me
    {
        name: 'Upload'
    }
 ]
于 2020-11-23T08:52:24.770 回答