将查询结果 snakecase 属性转换为 camelcase 的最有效方法

Most efficient way of transforming query result snakecase attributes to camelcase

我正在寻找最推荐(最佳实践)和最有效的方法来将我的 postgresql 查询结果从 snake_case 转换为驼峰命名法,然后再将其返回到 api JSON 使用 postgresql 和 express.js

的响应

我知道有几个选项,例如遍历结果并手动更改名称,使用 sql 等。但是,最佳方法是什么?

user.js 控制器:

const getProfile = async (req, res, next) => {    
  try {
    const user = await db.query("SELECT first_name, middle_name, last_name, display_name FROM user_account WHERE id = ", [req.user]);

    res.status(200).json({profile: user.rows[0]});
  }
  catch (err) {
    console.error(err.message);
    res.status(500).json("Server Error");
  }
};

当前响应:

"profile": {
    "first_name": "Joseph",
    "middle_name": "Robinette",
    "last_name": "Biden",
    "display_name": "Joe"
}

预期响应:

"profile": {
    "firstName": "Joseph",
    "middleName": "Robinette",
    "lastName": "Biden",
    "displayName": "Joe"
}

你可以使用这个句子来驼峰拼写一些单词:

select string_agg(palabra,'') from (
  select case when row_number>1 then upper(substr(palabra,1,1))||substr(palabra,2) else palabra end
    from (
      select *, row_number() over () from regexp_split_to_table('uno_dos_tres','_') palabra
    ) x
) x

运行 示例:http://sqlfiddle.com/#!17/56f78/1033

然后您可以使用它来应用于 json 对象:

select json_object_agg(key, value) from (
  select (
    select string_agg(palabra,'') from (
      select case when row_number>1 then upper(substr(palabra,1,1))||substr(palabra,2) else palabra end
        from (
          select *, row_number() over () from regexp_split_to_table(key,'_') palabra
        ) x
    ) x
) as key, value
  from json_each('{
    "first_name": "Joseph",
    "middle_name": "Robinette",
    "last_name": "Biden",
    "display_name": "Joe",
    "id": "do_not_change"
  }'::json) rows
) pairs

运行 示例:http://sqlfiddle.com/#!17/56f78/1035

两种方法都可以。您可以在 SQL:

const {rows} = await db.query(
  `SELECT
    first_name AS "firstName",
    middle_name AS "middleName",
    last_name AS "lastName",
    display_name AS "displayName"
  FROM user_account
  WHERE id = `,
  [req.user]
);

res.status(200).json({profile: rows[0]});

或在 JS 中:

const { rows: [user] } = await db.query("SELECT first_name, middle_name, last_name, display_name FROM user_account WHERE id = ", [req.user]);

res.status(200).json({
  profile: {
    firstName: user.first_name,
    middleName: user.middle_name,
    lastName: user.last_name,
    displayName: user.display_name,
  },
});

如果您构建更复杂的对象或对字段值进行转换,则第二种方法更可取。

第三种选择不是您自己执行此操作,而是使用内置此功能的 ORM。