Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to prevent Sequelize from inserting NULL for primary keys with Postgres

I have created a table in postgresql 9

create table stillbirth(id serial primary key, state varchar(100), count int not null, year int not null); 

trying to write a sample on node.js with sequelize 1.4.1 version.

mapped the above table as

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

now when i try to create a new instance of Stillbirth and save it, i get errors.

/** new instance create code **/

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

error i get

*Executing: INSERT INTO "stillbirth" ("state","year","count","id") VALUES ('Andhra Pradesh',2004,11,NULL) RETURNING ; could not save the row {"length":110,"name":"error","severity":"ERROR","code":"23502","file":"execMain.c","line":"1359","routine":"ExecConstraints"}

If you look at the sql that its generating, it puts null for the primary key which should ideally be generated by the db.

Can someone help me as to what am i missing here ?

like image 429
anishek Avatar asked Jan 15 '13 06:01

anishek


2 Answers

To expand on the answer from sdepold, as he recommended, you can omitNull to prevent sequelize from adding null values to the generated SQL. In general, this is good, and it also allows you to perform partial updates.

var sequelize = new Sequelize('db', 'user', 'pw', {
  omitNull: true
})

There is one caveat, though. How do you set a column to null if that's legitimately what you want to do?? The answer is that you can pass omitNull as part of your save.

user.address = null;
user.save({omitNull: false});

OR

user.update({address: null}, {omitNull: false});
like image 68
Jeff Fairley Avatar answered Oct 23 '22 09:10

Jeff Fairley


You have to instantiate Sequelize with a special flag called omitNull:

var sequelize = new Sequelize('db', 'user', 'pw', {
  omitNull: true
})

This will disable inserting undefined values as NULL. http://sequelizejs.com/#usage-options

You might need to update to v1.5.x or 1.6.0-betaX

like image 22
sdepold Avatar answered Oct 23 '22 09:10

sdepold