如何在MySQL X DevAPI查询中直接获取JSON对象数组而非数组数组?
使用MySQL X DevAPI直接获取JSON格式行数据
我正在使用MySQL X DevAPI操作MySQL中的关系表,代码如下:
// Working with Relational Tables var mysqlx = require('@mysql/xdevapi'); var myTable; // Connect to server using a connection URL mysqlx .getSession({ user: 'user', password: 'password', host: 'localhost', port: 33060 }) .then(function (session) { // Accessing an existing table myTable = session.getSchema('test').getTable('my_table'); // Insert SQL Table data return myTable .insert(['name', 'birthday', 'age']) .values(['Laurie', '2000-5-27', 19]) .execute() }) .then(function () { // Find a row in the SQL Table let columns = ['name', 'birthday'] return myTable .select(columns) .where('name like :name && age < :age') .bind('name', 'L%') .bind('age', 30) .execute(); }) .then(function (myResult) { let rows = myResult.fetchAll() // 这是二维数组 let columns = ['name', 'birthday'] rows = rows.map((row) => columns.reduce((a, column, index) => Object.assign(a, { [column]: row[index] }), {})) console.log(rows); // 转换为JSON对象数组,适合作为WEB API返回值 });
目前我每次都需要手动将二维数组转换为JSON对象数组:
function (myResult) { let rows = myResult.fetchAll() // 这是二维数组 let columns = ['name', 'birthday'] rows = rows.map((row) => columns.reduce((a, column, index) => Object.assign(a, { [column]: row[index] }), {})) console.log(rows); // 转换为JSON对象数组,适合作为WEB API返回值 }
MySQL X DevAPI作为一款优秀的库,应该有直接获取JSON格式结果的方法。请问在MySQL X DevAPI中,有哪些方法可以直接获取JSON格式的行数据?
直接获取JSON格式行数据的方法
在MySQL X DevAPI的Node.js客户端中,有三种实用方式可以直接获取JSON对象格式的行数据:
一次性获取所有对象:
fetchAllAsObjects()
结果集对象内置了fetchAllAsObjects()方法,会自动将返回的行转换为以列名为键的对象数组,无需手动处理:.then(function (myResult) { let rows = myResult.fetchAllAsObjects(); console.log(rows); // 直接得到JSON对象数组 });该方法会自动匹配查询返回的列名,不需要手动传入列名列表。
逐行获取对象:
fetchOneAsObject()
如果不需要一次性加载所有数据,想要逐行处理,可以使用fetchOneAsObject()方法,每次调用返回一行的对象格式数据:.then(function (myResult) { let row; while ((row = myResult.fetchOneAsObject())) { console.log(row); // 单条JSON对象 } });原生SQL查询结合对象结果
若偏好写原生SQL,通过会话的sql()方法执行查询后,结果集同样支持fetchAllAsObjects():.then(function (session) { return session.sql('SELECT name, birthday FROM my_table WHERE name LIKE :name AND age < :age') .bind('name', 'L%') .bind('age', 30) .execute(); }) .then(function (myResult) { let rows = myResult.fetchAllAsObjects(); console.log(rows); });
注意:这些方法需要
@mysql/xdevapi的较新版本支持,若当前版本没有,可通过npm update @mysql/xdevapi升级依赖包。
内容的提问来源于stack exchange,提问作者Alok
相关产品推荐
相关产品推荐

