У меня проблема. По какой-то причине, это совершенно за мной, созданный мной курсор ведет себя по-разному, когда я запускаю его в 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
}