Чтение BigQuery в Golang. Не все ожидаемые результаты приведены. Что делать? - PullRequest
1 голос
/ 20 января 2020

Учитывая, что SQL отлично работает в редакторе запросов. Тем не менее, после присвоения его структуре, данные, похоже, имеют разные значения. Почему это так?

var RunQuery = func(req *http.Request, query string)(*bigquery.RowIterator, error){
    ctx := appengine.NewContext(req)
    ctxWithDeadline, _ := context.WithTimeout(ctx, 30*time.Minute)
    bqClient, bqErr := bigquery.NewClient(ctxWithDeadline, project, option.WithCredentialsFile(serviceAccount))
    if bqErr != nil {
        log.Errorf(ctx, "%v", bqErr)
        return nil, bqErr
    }
    q := bqClient.Query(query)
    job, err := q.Run(ctx)
    if err != nil {
        log.Errorf(ctx, "%v", err)
        return nil, err
    }
    status, err := job.Wait(ctx)
    if err != nil {
        log.Errorf(ctx, "%v", err)
        return nil, err
    }
    if err := status.Err(); err != nil {
        log.Errorf(ctx, "%v", err)
        return nil, err
    }
    it, err := job.Read(ctx)
    if err != nil {
        log.Errorf(ctx, "%v", err)
        return nil, err
    }
    log.Infof(ctx, "Total Rows: %v", it.TotalRows)
    return it, nil
}

type Customers struct {
    CustomerName string `bigquery:"customer_name"`
    CustomerAge  int    `bigquery:"customer_age"`
}


var rowsRead int

func main() {
   query := `SELECT 
                   name as customer_name,
                   age as customer_age
             FROM customer_table
             WHERE customerStatus = '0'`
   customerInformation, customerInfoErr := RunQuery(req, query, false)
   if customerInfoErr != nil {
       log.Errorf(ctx, "Fetching customer information error :: %v", customerInfoErr)
       return
   }
   for {
        var row Customers 
        err := customerInformation.Next(&row)
        log.Infof(ctx, "row %v", row)
        if err == iterator.Done {
             log.Infof(ctx, "ITERATION COMPLETE. Rows read %v", rowsRead)
             break
        }
        rowsRead++
   }
}

Допустим, у меня есть результаты запросов customer_name|customer_age cat | 2 dog | 3 horse | 10 Но после присвоения его структуре, получилось customer_name|customer_age "" | 2 dog | "" "" | "" Почему это так? я даже протестировал его на чанке, где я установил ограничение в 1000, все те же результаты. Но результаты запроса в редакторе запросов - это то, что я ожидаю

1 Ответ

0 голосов
/ 21 января 2020

Решил, используя Value Loader bigquery.Value. Вместо использования ожидаемой структуры при отображении результатов запроса. б map[string]bigquery.Value. До сих пор не знаю, почему отображение результатов запроса с ожидаемой структурой не работает идеально. Вот мое решение.

for {
        row := make(map[string]bigquery.Value)
        err := customerInformation.Next(&row)
        log.Infof(ctx, "row %v", row)
        if err == iterator.Done {
             log.Infof(ctx, "ITERATION COMPLETE. Rows read %v", rowsRead)
             break
        }
        rowsRead++
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...