egg-sequelize 踩坑记录
2018-12-15 本文已影响137人
无米学炊
1.自动将表名称变为复数:
在egg.js typescript 开发采坑记录 发现解决方案:
在定义model的时候,禁止转换为复数
app.model.define('project', {
id: { type: INTEGER, primaryKey: true, autoIncrement: true },
name: STRING(20),
created_at: DATE,
updated_at: DATE
}, {
timestamps: true, // 自动维护时间戳 [ created_at、updated_at ]
// 禁止修改表名,默认情况下,sequelize将自动将所有传递的模型名称(define的第一个参数)转换为复数
// 但是为了安全着想,复数的转换可能会发生变化,所以禁止该行为
freezeTableName: true
});
或者直接修改 config/config.[env].js(下同)中的sequelize配置:
exports.sequelize = {
dialect: 'mysql',
....
define: {
underscored: true, // 注意需要加上这个, egg-sequelize只是简单的使用Object.assign对配置和默认配置做了merge, 如果不加这个 update_at会被转变成 updateAt故报错
// 禁止修改表名,默认情况下,sequelize将自动将所有传递的模型名称(define的第一个参数)转换为复数
// 但是为了安全着想,复数的转换可能会发生变化,所以禁止该行为
freezeTableName: true
}
}
- 时间存储问题
mysql保存时会自动保存为UTC格式,可以在config中配置:
exports.sequelize = {
dialect: 'mysql',
....
timezone: '+08:00' // 保存为本地时区
}
但是egg-sequelize在读取时间时,还是会返回UTC格式,还需要改一下配置,添加:
exports.sequelize = {
dialect: 'mysql',
....
timezone: '+08:00' ,// 保存为本地时区
dialectOptions: {
dateStrings: true,
typeCast(field, next) {
// for reading from database
if (field.type === "DATETIME") {
return field.string();
}
return next();
}
}
}
详情请参考Setting timezone