ecodeclub / eorm

简单 ORM 框架
Apache License 2.0
191 stars 64 forks source link

分库分表查询的Get方法为什么要合并为一个SQL? #215

Closed xsinxx closed 9 months ago

xsinxx commented 1 year ago

问题: 分库分表查询的Get方法为什么要合并为一个SQL?

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
}

eorm 分支

dev 分支

flycash commented 1 year ago

你是说那个 TODO 吗?很简单,就是那时候我们还没支持多个语句的地步。

xsinxx commented 1 year ago

我个人的理解,如果仅执行其中一条SQL是无法保证结果集的正确性。如limit x,y 语句 -> limit x + y进行执行,那么需要在上层对查询结果进行聚合。

flycash commented 1 year ago

是的,所以我们还没支持到这个地步