Closed xsinxx closed 9 months ago
func (s *ShardingSelector[T]) Get(ctx context.Context) (*T, error) { qs, err := s.Limit(1).Build(ctx) if err != nil { return nil, err } if len(qs) == 0 { return nil, errs.ErrNotGenShardingQuery } // TODO 要确保前面的改写 SQL 只能生成一个 SQL if len(qs) > 1 { return nil, errs.ErrOnlyResultOneQuery } q := qs[0] // TODO 利用 ctx 传递 DB name row, err := s.db.queryContext(ctx, q) if err != nil { return nil, err } if !row.Next() { return nil, ErrNoRows } tp := new(T) val := s.valCreator.NewPrimitiveValue(tp, s.meta) if err = val.SetColumns(row); err != nil { return nil, err } return tp, nil }
dev 分支
你是说那个 TODO 吗?很简单,就是那时候我们还没支持多个语句的地步。
我个人的理解,如果仅执行其中一条SQL是无法保证结果集的正确性。如limit x,y 语句 -> limit x + y进行执行,那么需要在上层对查询结果进行聚合。
是的,所以我们还没支持到这个地步
问题: 分库分表查询的Get方法为什么要合并为一个SQL?
eorm 分支
dev 分支