kingshard
kingshard copied to clipboard
Kingshard 目前支持枚举类型的分表分库吗?
Kingshard 目前支持枚举类型的分表分库吗?
怎么实现的?
在用kingshard做分库分表功能过程中,数据表中有一个 year字段,字段类型int或year。
做如下设置的时候,
type: date_year
nodes: [node1,node2]
date_range: [2015-2016,2017-2018]
insert into table(year
) values ('2014');
字段值必须设置为字符型,才能有效找到正确的分库分表。
请问能否支持这种场景,而不依赖MySQL的隐式转换?
实现源码如下, https://github.com/flike/kingshard/blob/master/proxy/router/shard.go
//the format of date is: YYYY-MM-DD HH:MM:SS,YYYY-MM-DD or unix timestamp(int) func (s *DateYearShard) FindForKey(key interface{}) (int, error) { switch val := key.(type) { case int: tm := time.Unix(int64(val), 0) return tm.Year(), nil case uint64: tm := time.Unix(int64(val), 0) return tm.Year(), nil case int64: tm := time.Unix(val, 0) return tm.Year(), nil case string: if v, err := strconv.Atoi(val[:4]); err != nil { panic(NewKeyError("invalid num format %v", v)) } else { return v, nil } } panic(NewKeyError("Unexpected key variable type %T", key))
没太明白你的问题, 字段值可以为int啊, 这两句SQL都能执行成功:
insert into table(year) values (2014);
insert into table(year) values ('2014');
没太明白你的问题, 字段值可以为int啊, 这两句SQL都能执行成功:
insert into table(year) values (2014); insert into table(year) values ('2014');
字段值为int后,路由不到对应的表, 例如: t_xxx_2014 而是路由到 t_xxx_1970