Найти соответствие между двумя наборами данных - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть функция, которая запрашивает два набора данных. Я хочу найти совпадение в двух наборах данных и обновить нашу базу данных данными из основного набора данных.

Проблема в том, что данные являются типами интерфейса. Я хотел бы перебрать их и найти соответствие, но я не уверен, что есть лучшая идея.

Как перебрать интерфейсы в Go и сопоставить эти точки данных в функции BackfillMissingData?

Это то, что я имею до сих пор.

type Account struct {
    SalesForceAccountId string
}

func FindIncompleteAccounts(qExec *database.PostgresDB) interface{} {
    var salesForceAccountId string
    rows, err := qExec.Query(
        `query string`)

    if err != nil {
        log.Fatal(err)
    }

    defer rows.Close()
    var accounts []Account

    for rows.Next() {
        err := rows.Scan(&salesForceAccountId)
        if err != nil {
            log.Fatal(err)
        }
        accounts = append(accounts, Account{SalesForceAccountId: salesForceAccountId})
    }

    err = rows.Err()
    if err != nil {
        log.Fatal(err)
    }
    return accounts
}

var client = &http.Client{Timeout: 10 * time.Second}

type Payload struct {
    Companies []Companies `json:"companies"`
}

type Companies struct {
    CompanyId int `json:"companyId"`
    Properties struct {
        SalesForceAccountId struct {
            Value string `json:"value"`
        }
    }
}

func RequestCompanies() interface{} {
    url := fmt.Sprintf("external api", apiKey)

    client := http.Client{
        Timeout: time.Second * 2,
    }

    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        log.Fatal(err)
    }

    req.Header.Set("User-Agent", "fetching-companies")

    res, getErr := client.Do(req)
    if getErr != nil {
        log.Fatal(getErr)
    }

    body, readErr := ioutil.ReadAll(res.Body)
    if readErr != nil {
        log.Fatal(readErr)
    }

    companies := Payload{}

    jsonErr := json.Unmarshal([]byte(body), &companies)

    if jsonErr != nil {
        log.Fatal(err)
    }

    return companies
}

func BackfillMissingData(qExec *database.PostgresDB) error {
    companies := RequestCompanies()
    incompleteAccounts := FindIncompleteAccounts(qExec)

}

Набор основных данных

{[{837002081 {{0012a00000IO7ToAAL}}} {837404922 {{001U000000i0xngIAA}}} {840907652 {{0012a00000Icl6gAAB}}}]}

Локальный набор данных

[{0010B00001qY5GoRAS}]

Первое число в наборе основных данных - это идентификатор компании, и я хочу сравнить второй элемент в основном наборе с моими локальными данными.

1 Ответ

0 голосов
/ 01 ноября 2018

Проблема в том, что функции RequestCompanies() и FindIncompleteAccounts(...) возвращают "пустой интерфейс" interface{}, что означает, что вы фактически не можете ничего сделать с этими значениями такими, какие они есть.

Вместо того, чтобы возвращать пустой интерфейс, эти методы должны возвращать либо типы структур, которые они фактически представляют (например, []Account и Payload), либо интерфейсы, которые абстрагируют операции с теми данными, которые имеют отношение к вашей задаче.

Таким образом, вы можете сравнить атрибуты между элементами в двух наборах данных (например, гипотетические Account.ID и Payload.Result.AccountID) и выполнить пересечение набора и возможное обновление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...