我一直在与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.
答案 0 :(得分: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);
}
就是这样,现在,当您运行应用程序时,如果您的任何对象已经插入数据库,播种器将检查数据库。如果是,则跳过播种机,如果没有,则插入它们。
我希望这对你们有所帮助。
答案 1 :(得分:0)
我遇到了同样的问题,问题是我在对象之间添加了逗号,以检查可能有用的语法错误
dataSources: [
{
name: 'Pattern'
},
,// this comma was added by mistake for me
{
name: 'Upload'
}
]