最近在研究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)
});
});
上面执行大概需要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)
});
用的朋友帮忙看看啊。在线等。
执行三条语句, 和执行一条语句比, 肯定三条慢啊。 一般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,我学习一下。感觉体会不是太深
- 定义model时候这样做:https://github.com/yujintang/koa2-server/tree/develop/server/model/sequelize
- 然后sync时候统一在外面这样去做:https://github.com/yujintang/koa2-server/blob/develop/server/init/sequelize.js
可以关注我的项目,star一下。
@yujintang looks good. Thx. added a star