Курсор в транзакции ведет себя по-разному между go и psql - PullRequest
0 голосов
/ 08 января 2020

У меня проблема. По какой-то причине, это совершенно за мной, созданный мной курсор ведет себя по-разному, когда я запускаю его в psql (где он работает), в отличие от того, когда я запускаю его через мой код go.

Я беру часть имен и передаю их как pq.Array в вызов функции выполнения транзакции. Из того, что я прочитал, это должно сработать для передачи нескольких значений произвольного числа в запрос. Но, видимо, нет ... Я не знаю, происходит ли это, потому что это происходит внутри курсора в транзакции, это единственное, о чем я могу думать больше.

Идея состоит в том, чтобы запросить все id в tenants имена которых НЕ появляются в этом списке, следовательно, с использованием оператора <>. Эти имена уникальны в базе данных.

Когда я запускаю его через код go, я получаю все id, а не только те, которые не отображаются в списке.

Я включил здесь функцию, транзакция запускается в вызывающей функции и передается этой. Скажите, если нужно включить что-то еще для дальнейшего разъяснения!

Я что-то упустил?

func DeleteTenants(orphanTenants []string, tx *sql.Tx) error {
    query := `
    DECLARE tenants_cursor CURSOR FOR
    SELECT id FROM tenants
    WHERE name <> ALL(ARRAY[$1])
    FOR UPDATE
    `
    if _, err := tx.Exec(query, pq.Array(orphanTenants)); err != nil {
        log.Println("DeleteTenants: Error creating Tenant cursor")
        return err
    }
    defer tx.Exec("CLOSE tenants_cursor")
    for {
        id := -1
        if err := tx.QueryRow("FETCH NEXT FROM tenants_cursor").Scan(&id); err != nil {
            if err == sql.ErrNoRows {
                log.Println("No rows found in tenants_cursor")
                break
            }
            log.Println("DeleteTenants: Error when fetching next row from Tenant cursor")
            return err
        }
        log.Println("Tenant ID to be deleted:", id)
        if err := deleteTenant(id, tx); err != nil {
            log.Println("DeleteTenants: Error returned from deleteTenant")
        }
    }
    return nil
}

1 Ответ

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

Неважно .. разобрался. Мне не нужно включать нотацию ARRAY в запрос при передаче pq.Array в запрос.

Это неловко! Ответь на мой вопрос в течение нескольких минут.

Таким образом, запрос будет выглядеть так:

query := `
DECLARE tenants_cursor CURSOR FOR
SELECT id FROM tenants
WHERE name <> ALL($1)
FOR UPDATE
`
if _, err := tx.Exec(query, pq.Array(orphanTenants)); err != nil {
    log.Println("DeleteTenants: Error creating Tenant cursor")
    return err
}
defer tx.Exec("CLOSE tenants_cursor")
...