使用 sequelize 在模型/实例中存储和检索 JSON 对象

Posted

技术标签:

【中文标题】使用 sequelize 在模型/实例中存储和检索 JSON 对象【英文标题】:Using sequelize to store and retrieve JSON objects within a Model/Instance 【发布时间】:2013-12-24 09:02:07 【问题描述】:

我希望在一个大型项目中利用 sequelize,并希望可以使用它将 JSON 对象作为属性存储在模型中。

我觉得我正在为此苦苦挣扎,但也许我错过了一些简单的东西?

我正在定义一个模型 (Context),如下所示:

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

现在,当我创建我的 Context 时,它似乎在我保存之前就可以工作了。

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

);

所以 JSON 设置正确,但 save().success() 方法返回的对象似乎没有我设置的正确值。

当我记录save().success() 方法(即contextSaved.values)返回的对象时,该对象如下所示:

 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)

一切都是空的!!

更奇怪的是,当我查看为保存contextMain所做的保存SQL查询时,它似乎正在保存正确!

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 *

注意:"_trackList"='"atrackList":"1111","anotherTrackList":2872'

另外,当我查看它的实际 SQL 行时,里面确实有字符串化的 JSON 对象

如果我使用 sequelize 加载上下文...

Context.findAll().success(function(contexts) 
  console.log(JSON.stringify(contexts))
  // also displays null for _trackList and trackList
);

太奇怪了。非常感谢任何帮助! 非常感谢!抱歉这篇文章太长了!

【问题讨论】:

【参考方案1】:

这显然是对象的 getter 和 setter 的错误,最近已解决: https://github.com/sequelize/sequelize/issues/759

【讨论】:

【参考方案2】:

您能否检查运行 JSON.stringify 的 setterMethod 是否被调用?也许它试图作为对象而不是字符串插入?

更广泛地说,您是否考虑过 MongoDb?可能还有其他原因导致它对您没有吸引力,但仅从对项目的一瞥来看,它似乎具有真正的优势——主要是不必在两个方向上解析 json ......但除此之外你d 能够执行诸如查询该对象内的值之类的事情,这在以后可能会被证明是有用的。

【讨论】:

感谢 Zeke,我已经通过日志记录进行了测试,当属性的初始设置完成时,getter 和 setter 都会被调用。当我保存实例时,setter 也会被调用。 开启sequelize调试,让我知道实际的插入查询是什么样子的?还要检查真实数据库中的记录吗? 这可能与这个问题有关:github.com/sequelize/sequelize/issues/759 另外,我目前正在使用 NoSQL (CouchDB)。我在这篇文章中排除了我的实际模型的许多细节,但项目的复杂性和 sequelize/ORM 的特性似乎值得作为一个选项进行探索。无论如何,这肯定更具探索性。原始帖子有 UPDATE 查询(靠近帖子底部),如果这就是您的意思吗? 对不起我的评论格式:/应该是单独的cmets! 很奇怪。 Mongoose 是 mongodb 的一个很好的 ORM,如果你还没有检查过的话。如果您不在 getter 中使用 JSON.parse 怎么办?只返回字符串?

以上是关于使用 sequelize 在模型/实例中存储和检索 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

避免 Sequelize 类的多个实例

使用 Typescript 在 Sequelize 模型中创建实例方法

仅从 sequelize 原始查询而不是模型实例中获取 dataValues

sequelize模型

Sequelize 从 belongsTo 关系中获取值

如何在sequelize中对嵌套模型中的列进行排序?