我在一个小的nodejs项目中使用Sequelize,使用mysql数据库。
使用findOrCreate,我可以找到现有对象并插入新对象,但是当新对象创建并返回时,主键是“未定义”。
module.exports = function(sequelize, DataTypes) {
var Student = sequelize.define('Student', {
id : {
type : DataTypes.BIGINT,
primaryKey : true
},
wxid : DataTypes.STRING,
client : DataTypes.STRING,
nick : DataTypes.STRING,
wallet : {type: DataTypes.INTEGER, defaultValue: 0},
mcount : {type: DataTypes.INTEGER, defaultValue: 0},
qcount : {type: DataTypes.INTEGER, defaultValue: 0},
status : {type: DataTypes.INTEGER, defaultValue: 0},
premium_type : {type: DataTypes.INTEGER, defaultValue: 0},
createtime : DataTypes.DATE,
lastqtime : DataTypes.DATE,
lastmtime : DataTypes.DATE
}, {
freezeTableName : true,
timestamps : false,
tableName : 'student_student',
associate: function(models) {
Student.hasMany(models.Question, {as:'questions', foreignKey: 'student_id'});
}
});
return Student;
};
db.Student.findOrCreate( { wxid : info.uid },
{
client: client_name,
createtime: new Date(),
lastmtime: new Date()
}).success(
function(stu, created) {
if (!stu) {
console.log('Stu[' + info.uid + '] not found.'.red);
} else {
if (created) {
stu.created = true;
console.log(stu.values);
//// Here, stu.id is 'undefined'
}
}
});
日志:
[app-0 (out) 2014-01-10T21:54:32] { id: undefined,
[app-0 (out) 2014-01-10T21:54:32] wxid: 'o6ssct7SHGXN1zlyD6vvfk3TMr68',
[app-0 (out) 2014-01-10T21:54:32] client: 'wxcs',
[app-0 (out) 2014-01-10T21:54:32] nick: undefined,
[app-0 (out) 2014-01-10T21:54:32] wallet: 0,
[app-0 (out) 2014-01-10T21:54:32] mcount: 0,
[app-0 (out) 2014-01-10T21:54:32] qcount: 0,
[app-0 (out) 2014-01-10T21:54:32] status: 0,
[app-0 (out) 2014-01-10T21:54:32] premium_type: 0,
[app-0 (out) 2014-01-10T21:54:32] createtime: Fri Jan 10 2014 21:54:32 GMT+0800 (CST),
[app-0 (out) 2014-01-10T21:54:32] lastqtime: undefined,
[app-0 (out) 2014-01-10T21:54:32] lastmtime: Fri Jan 10 2014 21:54:32 GMT+0800 (CST) }
但是当我查看数据库时,我发现该行已正确插入。
答案 0 :(得分:6)
将autoIncrement: true
添加到id字段,解决问题。
答案 1 :(得分:0)
我知道我在这里有点迟了但您也可以声明一个默认的beforeCreate函数来帮助您解决这个问题。
E.g。我使用shortid作为主键生成器,所以我的beforeCreate hook看起来像这样:
define: {
hooks: {
beforeCreate: function(o) {
if (!o.id) o.id = shortid.generate();
}
}
}