前续集人物在这里
使用原始的Knex语句从MariaDB提取数据的最佳方法是什么?以下是我尝试过的两种方法:
MariaDb:
SELECT JSON_OBJECT(
...........
) 'JSON_OBJECT'
jscript解释结果:
for ( tmp of result[0] ) { console.log (JSON.parse(tmp.JSON_OBJECT)) ; }
和这个MariaDb:
SELECT JSON_ARRAYAGG(
JSON_OBJECT(
..........
)
) 'JSON_ARRAYAGG'
jscript:
for ( tmp of JSON.parse(result[0][0]['JSON_ARRAYAGG'] )) { console.log(tmp) ; }
这两种方法都可以工作,但是可能有一种比使用JSON.parse
更干净的方法。
建议吗?
注意:我当然明白使用raw
有争议——我有很多非常大的sql语句,它们是在以前的应用程序中,我宁愿(现在)直接使用它们,而不是用纯Knex重写它们。
编辑:这可能"足够好";因为似乎knex raw并不一定返回对象。
节点:
SELECT JSON_ARRAYAGG(
JSON_OBJECT(
..........
)
) 'JSON_ARRAYAGG'
.....................................
const result = await knex.raw( sqlStatement, sqlQuery);
return result[0][0].JSON_ARRAYAGG ;
浏览器:
(async () => { try { let result = await app.service('raw-service').find({query: sqlQuery}) ; newResult = result; } catch (e) { console.log(e); } } )() ;
console.log(JSON.parse(newResult));
但是至少真正丑陋的东西被隐藏起来了,在node里面。
SQL数据库被设计为返回行或列;任何通过json路由的查询都不会是"最佳方法"。你要求。
您的第一次尝试至少使用行,因此比第二次更好。
也就是说,如果你只是修改现有的代码来使用Knex,而不是重写它,那么任何需要最小修改的代码都会导致更少的bug,应该是首选的。
要使用Knex从MariaDB数据库中提取数据,可以在Knex查询构建器对象上使用.select()方法。该方法允许您指定要从数据库中检索的列,以及使用.where()方法指定任何条件或过滤器。