我在postgresql 9中创建了一个表
create table stillbirth(id serial primary key, state varchar(100), count int not null, year int not null);
尝试使用sequelize 1.4.1版本在node.js上编写示例。
将上表映射为
var StillBirth = sequelize.define('stillbirth',
{ id: {type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true},
state: Sequelize.STRING,
year: Sequelize.INTEGER,
count: Sequelize.INTEGER
}, {timestamps: false, freezeTableName: true});
现在当我尝试创建一个新的Stillbirth实例并保存它时,我会收到错误。
/ **新实例创建代码** /
StillBirth
.build({state: objs[j].state, year: objs[j].year, count: objs[j].count})
.save()
.error(function(row){
console.log('could not save the row ' + JSON.stringify(row));
})
.success(function(row){
console.log('successfully saved ' + JSON.stringify(row));
})
错误我
*执行:INSERT INTO“stillbirth”(“州”,“年”,“计数”,“id”)VALUES('Andhra Pradesh',2004,11,NULL)RETURNING ; 无法保存行{“length”:110,“name”:“error”,“severity”:“ERROR”,“code”:“23502”,“file”:“execMain.c”,“line”: “1359”, “常规”: “ExecConstraints”}
如果你查看它生成的sql,它会为主键设置null,理想情况下应该由db生成。
有人可以帮我解释一下我在这里缺少什么吗?
答案 0 :(得分:17)
你必须使用一个名为omitNull
的特殊标志来实例化Sequelize:
var sequelize = new Sequelize('db', 'user', 'pw', {
omitNull: true
})
这将是disable inserting undefined values as NULL
。 http://sequelizejs.com/#usage-options
您可能需要更新到v1.5.x或1.6.0-betaX
答案 1 :(得分:3)
为了扩展来自sdepold
的答案,正如他所建议的那样,您可以omitNull
阻止续集将null
值添加到生成的SQL中。一般来说,这很好,它还允许您执行部分更新。
var sequelize = new Sequelize('db', 'user', 'pw', {
omitNull: true
})
但有一点需要注意。如果合法地将列设置为null
,如何将列设置为omitNull
?答案是,您可以通过user.address = null;
user.save({omitNull: false});
作为保存的一部分。
user.update({address: null}, {omitNull: false});
OR
SELECT
C.Class
, S.City
, COUNT(S.*) AS Count
FROM
Classes AS C INNER JOIN
Students AS S ON C.Project_Group = S.Project_Group
GROUP BY
C.Class
, S.City
答案 2 :(得分:2)
有一种解决方法,不使用omitNull。
这样做:
StillBirth
.build({state: objs[j].state, year: objs[j].year, count: objs[j].count})
.save(['state','year','count'])
.error(function(row){
console.log('could not save the row ' + JSON.stringify(row));
})
.success(function(row){
console.log('successfully saved ' + JSON.stringify(row));
})
通过发送一个属性数组作为save方法的参数,你强制sequelize只插入那个省略id的数组的属性,留给DB自动为你创建id。 =)
答案 3 :(得分:0)
也可以定义可以通过create方法设置的属性。例如,使用该命令可以将User模型限制为仅设置用户名和地址,而不能设置admin标志:
User.create({ username: 'barfooz', isAdmin: true }, { fields: [ 'username' ] }).then(user => {
// let's assume the default of isAdmin is false:
console.log(user.get({
plain: true
})) // => { username: 'barfooz', isAdmin: false }
})