[eggjs/egg]egg-sequelize underscored 字段映射问题

2025-11-20 131 views
4

Node Version:v8.12.0 Egg Version:2.2.1 Plugin Name: egg-sequelize@4.1.0、mysql2@1.6.1

核心代码 // config.default.js config.sequelize = { dialect: 'mysql', host: xxx, port: 3306, user: 'root', password: '123456', database: 'xxx', define: { underscored: false, }, };

// model\user.js `module.exports = app => { const { STRING, INTEGER, DATE } = app.Sequelize;

const User = app.model.define('user', { id: { type: INTEGER, primaryKey: true, autoIncrement: true }, name: STRING(30), age: INTEGER, created_at: DATE, updated_at: DATE, });

return User; };`

// controller/user.js `const Controller = require('egg').Controller;

class UserController extends Controller { async index() { const ctx = this.ctx; const list = await ctx.model.User.findAll(); ctx.body = { data: list, }; ctx.status = 200; } }

module.exports = UserController;`

错误提示: Unknown column 'createdAt' in 'field list'

希望数据库表里的字段是下划线格式,在返回给前端的字段采用小驼峰,同时前端增删改提交的字段也为小驼峰,并能正常插入。

回答

5

排查一下你的业务代码看看吧,这个报错说明 sequelize 和数据库定义是 created_at ,但是你传了 createdAt

2

排查一下你的业务代码看看吧,这个报错说明 sequelize 和数据库定义是 created_at ,但是你传了 createdAt

我想要的效果就是,数据库定义的为create_at,通过sequelize做一个映射,转换成小驼峰,交给前端渲染数据

5

+1 楼主怎么解决

7

+1 楼主怎么解决

const User = app.model.define('user', {
    id: { type: INTEGER, primaryKey: true, autoIncrement: true },
    name: STRING(30),
    age: INTEGER,
    createdAt: {
      type: DATE,
      field: 'created_at',
    },
    updatedAt: {
      type: DATE,
      field: 'updated_at',
    },
    lastName: {
      type: STRING,
      field: 'last_name',
    },
  });

然后记得在config.default.js

define: {
  underscored: false,
},
7

thx

4

@SkyLin0909 帮你格式化了下代码。

每一个写还是挺烦的,你可以写一个 app.model.define('user', formatter({ ... })) 来自动遍历转换

4

@SkyLin0909 帮你格式化了下代码。

每一个写还是挺烦的,你可以写一个 app.model.define('user', formatter({ ... })) 来自动遍历转换 没懂这个formatter。是需要自己写一个正则来替换_后第一个字母为大写吗?能否给一个具体的例子,或者我去看源码

1

自己写个函数,自动根据 key 计算出 field,就是一个简单的对象预处理

6

自己写个函数,自动根据 key 计算出 field,就是一个简单的对象预处理

好吧,我有看sequelize5.0以后是不是有计划支持这个功能,不再由用户自己编写这个预处理函数?