[英]Ruby: how to insert Hash value into Cassandra map
我试图使用Datastax驱动程序将以int, time, hash
提供的值存储到Cassandra中。
哈希显示为{ "Q17.1_4"=>"val", "Q17.2"=>"other", ...
}
将表定义为:
我可以正常插入PK,但是在将哈希值强制转换为Cassandra可以应付的值时遇到了麻烦。
创建了一个准备好的语句,并在(尝试)循环遍历值时使用它:
stmt = session.prepare( "insert into forms( id, stamp, questions ) values ( ?,?,? )" )
...
json_val.each{ |key,val|
result = session.execute( stmt, val[ 'ID' ].to_i, Time.parse( val[ 'tDate' ]).to_i, val )
}
如果我将“ val”作为哈希插入,则会出现此错误:
/lib/cassandra/statements/prepared.rb:53:在`bind'中:恰好期望3个绑定参数,给定2个(ArgumentError)
(对我来说)这表明没有一种将哈希转换为Cassandra想要的方法。
如果我将val作为字符串插入(使用hash.to_s
), hash.to_s
此错误:
/lib/cassandra/protocol/type_converter.rb:331:in
varchar_to_bytes': undefined method
encoding'for 1:Fixnum(NoMethodError)
...将其转换为json字符串,将双引号更改为单引号等等同样适用。
我可以使用cqlsh(命令行)插入值(将EG insert into forms (id, stamp, questions) values ( 123, 12345678, { 'one':'two','three':'four'});
)
所以问题是-如何将这个Ruby哈希转换为Cassandra驱动程序将接受的格式?
使用:
编辑:
“ questions”哈希的JSON值为{“ Q17.1_4”:“ val”,“ Q17.2”:“ other”,...}
另外-我可以插入前两列。 从insert语句中省略第三个值是可行的,因此我知道这两个值不是这里的罪魁祸首。
发现了两个问题:
如果最后一个参数是哈希,则将其视为选项。 因此,确保在执行带有最后一个参数的语句时必须传递空选项,而最后一个参数必须是map数据类型。
type_converter.rb:331:在
varchar_to_bytes': undefined method
编码为1:Fixnum(NoMethodError)
这使我相信某个地方存在无效值。 为了解决这个问题,我创建了一个临时哈希,并在将其添加到该临时哈希之前检查了每个值以确保它是字符串。 然后使用这个临时值,我可以使用存储过程将其添加到数据库中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.