将查询结果 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
两种方法都可以。您可以在 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。
我正在寻找最推荐(最佳实践)和最有效的方法来将我的 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
两种方法都可以。您可以在 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。