kingshard icon indicating copy to clipboard operation
kingshard copied to clipboard

Kingshard 目前支持枚举类型的分表分库吗?

Open eric-chao opened this issue 5 years ago • 2 comments

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))

eric-chao avatar Jan 30 '19 11:01 eric-chao

没太明白你的问题, 字段值可以为int啊, 这两句SQL都能执行成功:

insert into table(year) values (2014);
insert into table(year) values ('2014');

loxp avatar Jan 31 '19 02:01 loxp

没太明白你的问题, 字段值可以为int啊, 这两句SQL都能执行成功:

insert into table(year) values (2014);
insert into table(year) values ('2014');

字段值为int后,路由不到对应的表, 例如: t_xxx_2014 而是路由到 t_xxx_1970

image

eric-chao avatar Feb 13 '19 03:02 eric-chao