TuoLe
1
nebula 版本: 3.1.0
安装方式:docker-compose
nebula-go版本:v3.4.0
下面的代码使用了nebula-go库,功能为将一个map[string]interface{}类型的对象通过ExecuteWithParameter函数存储入库到nebulagraph数据库。
现在这段代码执行过程中遇到了一个bug:ErrorCode: -1005, ErrorMsg: Storage Error: The data type does not meet the requirements. Use the correct type of data.
func AddVertex(ptrPool *nebula.ConnectionPool) error {
// Create session
session, err := ptrPool.GetSession(username, password)
if err != nil {
log.Fatal(fmt.Sprintf("Fail to create a new session from connection pool, "+
"username: %s, password: %s, %s", username, password, err.Error()))
return err
}
// Release session and return connection back to connection pool
defer session.Release()
personMap := make(map[string]interface{})
personMap["Height"] = 1.78
personMap["Name"] = "asd"
insertNGQL := `
CREATE SPACE IF NOT EXISTS Myspace(vid_type=FIXED_STRING(20));
USE Myspace;
CREATE TAG IF NOT EXISTS Person (Height double null, Name string null);
INSERT VERTEX Person (Height, Name)
VALUES
"aaaaaaaaaaaaaaaaaaaa":($Height, $Name);
`
_, _ = session.Execute("USE Myspace;")
// Send
resultSet, err := session.ExecuteWithParameter(insertNGQL, personMap)
if err != nil {
fmt.Print(err.Error())
return err
}
checkResultSet("test", resultSet)
return nil
}
请问各位大佬看看这个问题该如何解决?
kyle
2
检查下参数值和属性类型是否一致。
(root@nebula) [nba]> :param p1=>"1"
(root@nebula) [nba]> :param p2=>3.4
(root@nebula) [nba]> insert vertex player values "1":($p1,$p2)
Execution succeeded (time spent 1908/2207 us)
(root@nebula) [nba]> insert vertex player(name, age) values "1":("1",3.4)
Execution succeeded (time spent 1981/2241 us)
(root@nebula) [nba]> desc tag player
+--------+----------+-------+---------+---------+
| Field | Type | Null | Default | Comment |
+--------+----------+-------+---------+---------+
| "name" | "string" | "YES" | | |
| "age" | "int64" | "YES" | | |
+--------+----------+-------+---------+---------+
Got 2 rows (time spent 2133/2516 us)
(root@nebula) [nba]> :param p2=>"3.4"
(root@nebula) [nba]> insert vertex player(name, age) values "1":("1","3.4")
[ERROR (-1005)]: Storage Error: The data type does not meet the requirements. Use the correct type of data.
(root@nebula) [nba]> insert vertex player(name,age) values "1":($p1,$p2)
[ERROR (-1005)]: Storage Error: The data type does not meet the requirements. Use the correct type of data.
TuoLe
3
感谢您的回复,我在控制台中是可以执行成功的,但是用nebula-go在golang客户端中传入类型为map[stirng]interface{}
的变量就不可以,我进入源码调试查看可以断定nebula-go是将map[stirng]interface{}
的变量成功转为nebula-go中的类型,但是执行插入语句过程报上述错误,怀疑是nebula-go的问题
kyle
4
@TuoLe 是的,目前 nebula-go 还不支持这样写,可以 work 的写法可以参考下:
func prepareParameter() {
// p1:true p2:3 p3:[true,3] p4:{"a":true,"b":"Bob"}
params = make(map[string]*nebula.Value)
var bVal bool = true
var iVal int64 = 3
p1 := nebula.Value{BVal: &bVal}
p2 := nebula.Value{IVal: &iVal}
p5 := nebula.Value{SVal: []byte("Bob")}
lSlice := []*nebula.Value{&p1, &p2}
var lVal nebula.NList
lVal.Values = lSlice
p3 := nebula.Value{LVal: &lVal}
var nmap map[string]*nebula.Value = map[string]*nebula.Value{"a": &p1, "b": &p5}
var mVal nebula.NMap
mVal.Kvs = nmap
p4 := nebula.Value{MVal: &mVal}
params["p1"] = &p1
params["p2"] = &p2
params["p3"] = &p3
params["p4"] = &p4
}
支持 map[string]interface{} 的话只需要做一个简单的类型转换再传入到 ExecuteWithParameter 接口即可,目前需要用户自己去做转换。感谢发现问题,你可以提 issue 或者帮我们贡献代码,可以参考下 nebula-java parameter value type transformation 的做法
TuoLe
5
@kyle
感谢您的回复,仍要和您请教,
目前看调用ExecuteWithParameter
函数传入的形参params
仍然要求是map[string]interface{}
,尽管map中的值已经是*nebula2.Vaule
类型,仍然不能转换成功
// ...
// 准备传入的参数map
var limitNum int64 = 5
queryParamas := make(map[string]interface{})
queryParamas["TagName"] = &nebula2.Value{SVal: []byte(" Employees")}
queryParamas["LimitNum"] = &nebula2.Value{IVal: &limitNum}
// 执行查询语句:仍然不起效果
res, err := ptrSession.ExecuteWithParameter(
"MATCH (v:($TagName)) return v limit ($LimitNum);", queryParamas)
// ...
请您看看这一步该如何继续应用?
system
关闭
6
此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。