【问题标题】:Most efficient way of transforming query result snakecase attributes to camelcase将查询结果snakecase属性转换为camelcase的最有效方法
【发布时间】:2021-04-07 17:07:05
【问题描述】:

我正在寻找最推荐(最佳实践)和最有效的方法,将我的 postgresql 查询结果从 snake_case 转换为 camelCase,然后使用 postgresql 和 express.js 在 api JSON 响应中返回它

我知道有几个选项,例如循环遍历结果并手动更改名称,使用 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 = $1", [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"
}

【问题讨论】:

  • 更改生成这些对象的 SQL 将是最合适的选择。请发布此代码,以便我们更具体地为您提供帮助。
  • @Bergi: 发布了我的用户控制器

标签: node.js postgresql express node-postgres


【解决方案1】:

这两种方法都很好。您可以在 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 = $1`,
  [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 = $1", [req.user]);

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

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

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

【讨论】:

    【解决方案2】:

    你可以用这句话来拼写一些单词:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多