2013-01-15 1 views
8

J'ai créé une table postgresql 9Comment éviter Sequelize d'insérer NULL pour les clés primaires avec Postgres

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

essayer d'écrire un échantillon sur Node.js avec version sequelize 1.4.1.

cartographié le tableau ci-dessus

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

maintenant lorsque je tente de créer une nouvelle instance de mortinaissance et de l'enregistrer, je reçois des erreurs.

/** nouvelle instance créer un 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)); 
    }) 

erreur que je reçois

* Exécution: INSERT INTO "mort-né" ("Etat", "année", "compte", » id ") VALEURS ('Andhra Pradesh', 2004,11, NULL) RETOURNANT ; impossible d'enregistrer la ligne {"longueur": 110, "nom": "erreur", "gravité": "ERREUR", "code": "23502", "fichier": "execMain.c", "ligne" : "1359", "routine": "ExecConstraints"}

Si vous regardez le sql que sa génération, il met null pour la clé primaire qui devrait idéalement être générée par le db.

Quelqu'un peut-il m'aider pour ce qui me manque ici?

Répondre

13

Vous devez le récupérer Sequelize avec un drapeau spécial appelé omitNull:

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

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

Vous pourriez avoir besoin de mettre à jour ou v1.5.x 1.6.0-Betax

+0

Merci qui a travaillé avec la version 1.5.x, de façon surprenante le registre de NPM https://npmjs.org/package/sequelize ne marche pas mentionner quoi que ce soit à propos de la version 1.5.0. – anishek

+1

essayez 'npm show sequelize' sur la ligne de commande. :) – sdepold

+1

Le problème avec cette solution est que lorsque vous essayez d'effectuer une mise à jour comme this user.save ({adresse: null}); cela ne change pas l'adresse dans la base de données. Est-il possible d'effectuer une mise à jour et de définir un attribut sur null? – lao

1

Il existe une solution cela sans l'aide omitNull.

Il suffit de faire ceci:

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

En envoyant un tableau de propriétés en tant que paramètre pour méthode de sauvegarde forcer sequelize insérer uniquement les propriétés de ce tableau avec omission l'identifiant, en laissant à la DB créer automatiquement l'identifiant pour toi. =)

+0

c'est la façon dont l'auteur suggère, alors merci :) – colthreepv

1

Pour développer la réponse de sdepold, comme il le recommandait, vous pouvez omitNull pour empêcher séquelize d'ajouter des valeurs null au SQL généré. En général, c'est bon, et cela vous permet également d'effectuer des mises à jour partielles.

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

Cependant, il existe une mise en garde. Comment définir une colonne à null si c'est légitimement ce que vous voulez faire ?? La réponse est que vous pouvez passer omitNull dans le cadre de votre sauvegarde.

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

OU

user.update({address: null}, {omitNull: false}); 
Questions connexes