使用 sequelize 在 mySql 中定义静态函数(如在 mongoose 中)

Posted

技术标签:

【中文标题】使用 sequelize 在 mySql 中定义静态函数(如在 mongoose 中)【英文标题】:defining statics function (like in mongoose) in mySql using sequelize 【发布时间】:2017-09-13 01:32:34 【问题描述】:

尝试在模型中定义一个函数,以便我可以拥有一组通用的函数。这是我的表格代码。我正在使用 sequelize ORM 和 nodejs

"use strict";

module.exports = function(sequelize, DataTypes) 
  var AttendantUser = sequelize.define('AttendantUser', 
    user_id : 
      type : DataTypes.CHAR(36),
      defaultValue : DataTypes.UUIDV4,
      primaryKey : true
    ,
    mobile : 
        type : DataTypes.BIGINT,
        allowNull : false,
        unique : true
    ,
    reset_code : 
      type : DataTypes.INTEGER,
      allowNull : true,
      defaultValue : '0000'
    
  ,
    freezeTableName : true,
    paranoid : true
  );


AttendantUser.usernameInUse = function (callback) 
 console.log("fefe");
 callback(null, "hello");
 
  return AttendantUser;
;

我尝试使用 usernameInUse 函数时遇到的错误是 . 错误:mModels.usernameInUse 不是函数

【问题讨论】:

你检查过 Hooks 吗? docs.sequelizejs.com/en/v3/docs/hooks mModels 变量是什么? 【参考方案1】:

这就是 classMethods 的用途。在Sequelize documentation page 中查找选项“[options.classMethods]”。

您的代码必须是这样的:

"use strict";

module.exports = function(sequelize, DataTypes) 
  var AttendantUser = sequelize.define('AttendantUser', 
    user_id : 
      type : DataTypes.CHAR(36),
      defaultValue : DataTypes.UUIDV4,
      primaryKey : true
    ,
    mobile : 
        type : DataTypes.BIGINT,
        allowNull : false,
        unique : true
    ,
    reset_code : 
      type : DataTypes.INTEGER,
      allowNull : true,
      defaultValue : '0000'
    
  ,
    freezeTableName : true,
    paranoid : true,
    classMethods : 
       usernameInUse = function (callback) 
            console.log("fefe");
            callback(null, "hello");
            return this;
       
    
  );

与数据库同步后,即可导入模型

AttendantUser = require('/path/to/attendant-user');

然后你可以像这样调用静态方法:

AttendantUser.usernameInUse(() => console.log('callback called.');)

【讨论】:

【参考方案2】:

在Sequelize V4。它看起来与 V3 不同。

classMethodsinstanceMethods 选项已从 sequelize.define 中删除。 Sequelize 模型现在是 ES6 类。您可以像这样设置类/实例级别的方法:

const Model = sequelize.define('Model', 
    ...
, 
    classMethods: 
        associate: function (model) ...
    ,
    instanceMethods: 
        someMethod: function ()  ...
    
);

const Model = sequelize.define('Model', 
    ...
);

// Class Method
Model.associate = function (models) 
    ...associate the models
;

// Instance Method
Model.prototype.someMethod = function () ..

【讨论】:

这个问题应该被标记为答案......另一个太老了,我遇到了很多麻烦......你能结束一个链接到讨论这个问题的文档吗?因为我没找到:c @nishi 已更新

以上是关于使用 sequelize 在 mySql 中定义静态函数(如在 mongoose 中)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sequelize 和 mysql 创建一对一的关系?

使用egg.js和egg-sequelize连接mysql

在 MySQL 中使用 sequelize 自动递增 id

Sequelize:批量插入

何时在 MYSQL 中使用 Sequelize?

sequelize 操作 mysql 基础