问题描述
我正在尝试 cassandra 节点驱动程序并在插入记录时遇到问题,看起来 cassandra 驱动程序无法插入浮点值.
I am trying cassandra node driver and stuck in problem while inserting a record, it looks like cassandra driver is not able to insert float values.
Problem: When passing int value for insertion in db, api gives following error:
Debug: hapi, internal, implementation, error
ResponseError: Expected 4 or 0 byte int (8)
at FrameReader.readError (/home/gaurav/Gaurav-Drive/code/nodejsWorkspace/cassandraTest/node_modules/cassandra-driver/lib/readers.js:291:13)
at Parser.parseError (/home/gaurav/Gaurav-Drive/code/nodejsWorkspace/cassandraTest/node_modules/cassandra-driver/lib/streams.js:185:45)
at Parser.parseBody (/home/gaurav/Gaurav-Drive/code/nodejsWorkspace/cassandraTest/node_modules/cassandra-driver/lib/streams.js:167:19)
at Parser._transform (/home/gaurav/Gaurav-Drive/code/nodejsWorkspace/cassandraTest/node_modules/cassandra-driver/lib/streams.js:101:10)
at Parser.Transform._read (_stream_transform.js:179:10)
at Parser.Transform._write (_stream_transform.js:167:12)
at doWrite (_stream_writable.js:225:10)
at writeOrBuffer (_stream_writable.js:215:5)
at Parser.Writable.write (_stream_writable.js:182:11)
at write (_stream_readable.js:601:24)
我正在尝试从代码执行以下查询:
I am trying to execute following query from code:
INSERT INTO ragchews.user
(uid ,iid ,jid ,jpass ,rateCount ,numOfratedUser ,hndl ,interests ,locX ,locY ,city )
VALUES
('uid_1',{'iid1'},'jid_1','pass_1',25, 10, {'NEX1231'}, {'MUSIC'}, 21.321, 43.235, 'delhi');
传递给execute()
的参数是
var params = [uid, iid, jid, jpass, rateCount, numOfratedUser, hndl, interest, locx, locy, city];
哪里
var locx = 32.09;
var locy = 54.90;
并调用执行看起来像:
var addUserQuery = 'INSERT INTO ragchews.user (uid ,iid ,jid ,jpass ,rateCount ,numOfratedUser ,hndl ,interests ,locX ,locY ,city) VALUES (?,?,?,?,?,?,?,?,?,?,?);';
var addUser = function(user, cb){
console.log(user);
client.execute(addUserQuery, user, function(err, result){
if(err){
throw err;
}
cb(result);
});
};
CREATE TABLE ragchews.user(
uid varchar,
iid set<varchar>,
jid varchar,
jpass varchar,
rateCount int,
numOfratedUser int,
hndl set<varchar>,
interests set<varchar>,
locX float,
locY float,
city varchar,
favorite map<varchar, varchar>,
PRIMARY KEY(uid)
);
附言在尝试理解问题时的一些观察:
P.S Some observations while trying to understand the issue:
看起来,问题出在 float 上,所以我将 float(locX、locY)类型更改为 int 并重新运行代码.同样的错误仍然存在.因此,这不是与浮点 CQL 类型相关的问题.接下来,我尝试从 INSERT 查询中删除所有 int 并尝试仅插入非数字值.这次尝试成功地将值输入到 db 中.因此现在看起来,这个问题可能与数字类型有关
.
推荐答案
以下文字摘自 cassandra 节点驱动程序数据类型文档
在编码数据时,在带参数的正常执行中,驱动程序尝试根据输入类型猜测目标类型.Number 类型的值将被编码为 double(因为 Number 是 double/IEEE 754 值).
When encoding data, on a normal execute with parameters, the driver tries to guess the target type based on the input type. Values of type Number will be encoded as double (as Number is double / IEEE 754 value).
考虑以下示例:
var key = 1000;
client.execute('SELECT * FROM table1 where key = ?', [key], callback);
如果键列是 int 类型,则执行失败.有两种可能的方法可以避免此类问题:
If the key column is of type int, the execution fails. There are two possible ways to avoid this type of problem:
准备数据(推荐) - 在执行前准备查询
Prepare the data (recommended) - prepare the query before execution
client.execute('SELECT * FROM table1 where key = ?', [key], { prepare : true }, callback);
提示目标类型 - 提示:第一个参数是一个整数`
Hinting the target types - Hint: the first parameter is an integer`
client.execute('SELECT * FROM table1 where key = ?', [key], { hints : ['int'] }, callback);
如果您正在处理批量更新,那么这个问题 可能是您的兴趣所在.
If you are dealing with batch update then this issue may be of your interest.
这篇关于ResponseError : 预期的 4 或 0 字节 int的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
更多推荐
[db:关键词]
发布评论