À l'aide de sequelize pour stocker et récupérer des objets JSON dans un Modèle/Exemple
Je suis à la recherche de l'effet de levier sequelize sur un gros projet, et espérais que je pourrais l'utiliser pour stocker un Objet JSON comme une propriété dans un Modèle.
Je me sens comme j'ai du mal avec cela, mais peut-être que je suis absent quelque chose de simple?
Je suis à la définition d'un modèle (Context
) comme suit:
var contextProperties = {
contextName: { type: Sequelize.STRING, validate: { is: ["[a-z]",'i'], notEmpty: true } },
_trackList: {type: Sequelize.TEXT},
trackList: {type: Sequelize.TEXT}
}
var contextGetSet = {
getterMethods: {
trackList: function(){
return JSON.parse(this._trackList);
}
},
setterMethods: {
trackList: function(v){
this._trackList = JSON.stringify(v);
}
}
};
var Context = sequelize.define('Context', contextProperties, contextGetSet);
Maintenant, quand je créer mon Context
, il semble que cela fonctionne avant de me sauver.
var contextMain;
Context.create({contextName: "Whatever"}).success(function (context){
contextMain = context;
contextMain.trackList = { atrackList: "1111", anotherTrackList: 2872 };
console.log(constextMain.trackList);
//logs { atrackList: "1111", anotherTrackList: 2872 } as expected
contextMain.save().success(function (contextSaved){
console.log(contextSaved.values);
//all values are null except for the contextName
});
});
De sorte que le JSON EST le réglage de droit, mais de l'objet renvoyé par le save().success()
méthode ne semble pas avoir les bonnes valeurs de ce que j'ai mis à.
Quand je log l'objet retourné par la save().success()
méthode (ie. contextSaved.values
) l'objet ressemble à ceci:
{ contextName: 'Whatever',
_trackList: 'null',
trackList: null,
id: 6,
createdAt: Fri Dec 06 2013 15:57:39 GMT-0500 (EST),
updatedAt: Fri Dec 06 2013 15:57:39 GMT-0500 (EST)
}
Tout est nul!!
Encore plus bizarre, c'est que quand je regarde les sauver de la requête SQL de sauvegarde contextMain
, il semble être sauver des droite!
Executing: UPDATE "Contexts" SET "contextName"='Whatever', "_trackList"='{"atrackList":"1111","anotherTrackList":2872}', "trackList"=NULL,"id"=7, "createdAt"='2013-12-06 20:59:39.278 +00:00', "updatedAt"='2013
-12-06 20:59:39.294 +00:00' WHERE "id"=7 RETURNING *
Avis que: "_trackList"='{"atrackList":"1111","anotherTrackList":2872}'
Aussi quand je regarde les réels SQL ligne pour elle, il ne le stringified objet JSON y!
Si je charge le Contexte à l'aide de sequelize...
Context.findAll().success(function(contexts) {
console.log(JSON.stringify(contexts))
//also displays null for _trackList and trackList
});
Sorte de très étrange. Toute aide grandement, grandement appréciée!!
Merci beaucoup! Désolé, ce post est très long!
OriginalL'auteur Arjun Mehta | 2013-12-06
Vous devez vous connecter pour publier un commentaire.
C'était apparemment un bug avec les getters et setters pour les objets et résolu récemment:
https://github.com/sequelize/sequelize/issues/759
OriginalL'auteur Arjun Mehta
Pouvez-vous vérifier si le setterMethod qui est en cours d'exécution JSON.stringify est appelé? C'est peut-être en essayant d'insérer un objet n'est pas une chaîne de caractères?
De façon plus générale, avez-vous envisagé de MongoDb? Il peut y avoir d'autres raisons pour lesquelles il n'est pas attrayant pour vous, mais seulement à partir de ce coup d'œil dans le projet, il semble qu'il aurait de réels avantages--surtout ne pas avoir à analyser json dans les deux sens... mais au-delà de que vous seriez en mesure de faire des choses comme de la requête avec les valeurs à l'intérieur de cet objet, ce qui peut s'avérer utile plus tard.
Allumez sequelize de débogage et laissez-moi savoir ce que les effectifs de requête d'insertion ressemble? Vérifiez également l'enregistrement dans le réel db?
Cela est probablement lié à cette question: github.com/sequelize/sequelize/issues/759 en outre, je suis actuellement en utilisant un NoSQL (CouchDB). Je suis à l'exclusion d'un grand nombre de détails de mon modèle(s) pour ce poste, mais la complexité du projet et les caractéristiques de sequelize/ORM certainement sembler comme il vaut la peine d'explorer cette option. Ce n'est certainement plus exploratoire de toute façon. Le post original a la requête de mise à JOUR (en bas du post), si c'est ce que tu veux dire?
Désolé pour mon commentaire de formatage :/ doivent avoir été séparé des commentaires!
Bizarre. La mangouste est un grand ORM pour mongodb, si vous n'avez pas vérifié encore. Que faire si vous n'avez pas de JSON.analyser dans la lecture? Il suffit de retourner la chaîne?
OriginalL'auteur Zeke Alexandre Nierenberg