sequelize 建立对象映射
发布于 7 年前 作者 chenkang084 5130 次浏览 来自 问答

最近在研究sequelize ,确实比较好用。但是,我有一个问题就是,sequelize 在建立对象映射的时候,是不是每次都会create table????

var SocialUrl = db.define(
            "SocialUrl",
            {
                NT_LOGIN: {type: Sequelize.STRING, primaryKey: true},
            },
            {
                tableName: "game_usr_prfl",
                timestamps: false
            }
        );

        SocialUrl.sync()
            .then(() => {
            })
            .then(() => {
                SocialUrl.findAll({
                    where: {
                        NT_LOGIN: 'kanchen'
                    }
                }).then(users => {
                    res.send(users)
                });
            });

微信截图_20170712104438.png 上面执行大概需要20ms左右。

直接使用mysql包,通过连接池,大概只需要2ms左右,而且走的是缓存。

pool.query("SELECT * FROM game_usr_prfl WHERE NT_LOGIN = ?", ['kanchen'], function (error, results, fields) {
            if (error) throw error;
            // console.log(results);
            res.send(results)
        });

微信截图_20170712104849.png

16 回复

用的朋友帮忙看看啊。在线等。

执行三条语句, 和执行一条语句比, 肯定三条慢啊。 一般Sequelize.define在项目启动时执行一次就够了, 不用放在controller里面, 每次执行。

@pentium100 谢谢你的回答。感觉很有启发。按照你的意思,是不是应该把所有需要映射的table,在项目启动的时候去做映射,然后缓存在内存中。在需要用的时候,直接取缓存的对象,这样其实就只执行一条查询语句,是这样吗???

顶起来。希望更多的朋友关注一下这个问题。

define不用每次都执行。

sequelize本来就是一套工具追求高性能还是以自己写为主吧

const app = sequelize.define('app', {
  userId: {
    type: Sequelize.STRING(8),
    allowNull: false,
  }
})
app.sync()
app.findOrCreate({
  where: {
    id: 1
  },
  defaults: {
    userId: 'admin'
  }
}).spread((res, data) => {
  if (data) {
    console.log('初始化成功')
  } else {
    console.log('已初始化')
  }
})

module.exports = app

项目启动的时候初始化一次,查询的时候直接app.find就好了

@unliar 嗯。我觉得这样方法可行。但是,这个也会执行create 操作对吧,只是不成功罢了。然后,下次使用的时候,就直接从find里面取值就ok了。因为已经映射过了,是这样理解对吧?谢谢你。

你调用 Model.sync() 方法才会 create table 的。

@stonephp 是的。但是,如何 要建立 table 和对象的映射,是不是必须 sync呢??

@chenkang084 只在开发的时候sync。部署的时候通过导出开发环境的db 结构来部署。

@stonephp 这个有点不太明白,能解释具体点吗?“ 部署的时候通过导出开发环境的db 结构 ” 指的是导出sql脚本吗? 那部署生产环境 不需要做对象映射吗?难怪是通过环境变量,执行不同的代码结构吗???方便的话,加个q:305058704 详细讨论一下。谢谢你。

@chenkang084 我说的是我的处理方案。我在开发环境一般会通过 sync 来自动创建表。之后dump 出来数据表结构。 之后测试和部署的都是将导出的结构导入到库中。

后续开发需要修改表结构的时候我都是自己整理升级语句。

并不是每次启动服务都得创建表,所以需要把 sync 和 define 这两步解耦(拆成分开的文件)。 在部署项目时,启动服务器前先手动做一步init操作,也就是写个脚本调用一下 sync 初始化各种表;之后再启动服务。

@g8up 有没有推荐的code,我学习一下。感觉体会不是太深

可以关注我的项目,star一下。

@yujintang looks good. Thx. added a star

回到顶部