Cassandra执行插入查询后如何立即获取插入行?遇返回undefined问题
在Cassandra插入后立即获取刚插入的行
嘿,我明白你遇到的问题了——Cassandra的INSERT语句默认不会返回你刚插入的行数据,所以你拿到的result.rows自然是undefined。咱们来一步步解决这个问题:
为什么原代码会失败?
你在INSERT语句里用了uuid()让Cassandra服务器端生成ID,但默认情况下,Cassandra执行INSERT后不会返回任何结果集,所以result.rows是空数组,访问result.rows[0]自然就得到undefined了。
解决方案有两种,你可以根据需求选:
方法1:在客户端生成UUID,提前知道ID
这种方法兼容性更好(哪怕用的是较老版本的Cassandra),而且不需要额外的查询操作就能拿到ID:
const cassandra = require('cassandra-driver'); const client = new cassandra.Client({ contactPoints: ['h1', 'h2'], keyspace: 'ks1' }); // 用Cassandra驱动自带的工具生成UUID,不用额外装包 const userId = cassandra.types.Uuid.random(); // 把生成好的ID传入INSERT语句 let query = "INSERT INTO users (id, name, email ) values (?, ?, ?)"; client.execute(query, [userId, 'badis', 'badis@badis.com']) .then(result => { console.log('User with id %s', userId.toString()); // 如果需要完整的行数据,再执行一次SELECT查询 return client.execute('SELECT * FROM users WHERE id = ?', [userId]); }) .then(selectResult => { console.log('完整的用户数据:', selectResult.rows[0]); });
方法2:用RETURNING子句让Cassandra返回插入的数据
Cassandra 2.0及以上版本支持RETURNING子句,执行INSERT时可以指定返回哪些列(用*返回所有列),这样一次操作就能拿到刚插入的行:
const cassandra = require('cassandra-driver'); const client = new cassandra.Client({ contactPoints: ['h1', 'h2'], keyspace: 'ks1' }); // 加入RETURNING * 让Cassandra返回插入的完整行 let query = "INSERT INTO users (id, name, email ) values (uuid(), ?, ?) RETURNING *"; client.execute(query, [ 'badis', 'badis@badis.com' ]) .then(result => { if (result.rows.length > 0) { console.log('User with id %s', result.rows[0].id); console.log('完整的用户数据:', result.rows[0]); } });
两种方法的小提示:
- 方法1适合需要兼容老版本Cassandra,或者只需要ID不需要完整行的场景;
- 方法2更简洁高效,一次请求就能拿到所有需要的数据,适合需要完整行数据的场景。
内容的提问来源于stack exchange,提问作者Bmaed Riasbet
相关产品推荐
相关产品推荐

