SQL Server:每个结果的下半驼峰

时间:2018-12-27 17:54:58

标签: node.js sql-server

我正在创建一个以SQL Server作为数据库的API。我的表和列使用的Pascal大小写(CountryIdIsDeleted等)无法更改。

所以当我这样做时:

const mssql = require('mssql');
var sqlstr =
'select * from Country where CountryId = @countryId';
var db = await koaApp.getDb();
let result = await db.request()
  .input('countryId', mssql.Int, countryId)
  .query(sqlstr);

我得到的对象是

{
    CountryId: 1,
    CountryName: "Germany"
}

但我希望成为

{
    countryId: 1,
    countryName: "Germany"
}

我知道有一个“行”事件,但是我想要更有效的方法(因为我可能从查询中返回几行,上面只是一个例子)。

有什么建议吗?

PS:我想避免使用FOR JSON语法

2 个答案:

答案 0 :(得分:2)

将其发布为实际答案,因为它对OP很有帮助:

如果可行,您可以尝试这样简单地在查询中指定列:

select 
    CountryID countryId,  
    CountryName countryName 
from 
    Country 
where 
    CountryId = @countryId

通常,由于性能原因,在查询中始终使用select *并不是最佳实践。

一个简单的解释,在每个列名(例如CountryName [countryName]之后的方括号内放置一个空格和一个新名称(或者更好的做法是,这可以在新名称中包含空格之类的字符) )在从SQL返回时,使用您选择的新名称为名称加上别名。

答案 1 :(得分:1)

我建议使用lodash实用程序库转换列名,为此,有一个_.camelCase函数:

CamelCase documentation

_.camelCase('Foo Bar');
// => 'fooBar'

_.camelCase('--foo-bar--');
// => 'fooBar'

_.camelCase('__FOO_BAR__');
// => 'fooBar'

您可以使用Object.entries枚举结果键,然后进行归约,例如

let result = {
    CountryId: 1,
    CountryName: "Germany"
};
let resultCamelCase = Object.entries(result).reduce((obj,[key,value]) => {
    obj[_.camelCase(key)] = value;
    return obj;
}, {});

console.log(resultCamelCase);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>