Переменная SQL не обновляется в запросе выбора в клиенте go - PullRequest
0 голосов
/ 27 июня 2019

Я выполняю следующие запросы в SQL.

SET @thisid=0;
SET @serial=0;

SELECT @serial := IF((@thisid != `places`.`id`), @serial + 1, @serial) as `serial`, @thisid := `places`.`id`, `places`.`id` FROM `places`;

Переменная @serial в основном увеличивается, только если новый идентификатор не совпадает с последним. После выполнения этих запросов в терминале и печати значений @serial и @thisid получаемое значение равно @ thisid = 'id6' @ serial = 6.

Я выполнил этот запрос в своем коде go:

if _, err = repo.db.ExecContext(ctx, "SET @thisid=0;"); err != nil {
    return
}

if _, err = repo.db.ExecContext(ctx, "SET @serial=0;"); err != nil {
    return
}

rows, err = repo.db.QueryContext(ctx, fmt.Sprintf(
    "SELECT @serial := IF((@thisid != `places`.`id`), @serial + 1, @serial) as `serial`, @thisid := `places`.`id`, `places`.`id` FROM `places`;",
))
if err != nil {
    fmt.Println("error here")
    return
}

if err = repo.db.QueryRow("SELECT @serial").Scan(&that); err != nil {
    return
}

if err = repo.db.QueryRow("SELECT @thisid").Scan(&this); err != nil {
    return
}

При печати значений @thisid и @serial значение @thisid принимается так же, как и значение @serial, равное 0. Кажется, что оно не обновляется динамически.

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Go использует пул соединений, что означает, что каждый запрос может происходить на другом соединении.переменные, подобные этой, относятся к соединению.Если вам нужно, чтобы они продолжались между запросами, вам нужно использовать транзакцию, чтобы убедиться, что вы остаетесь в пределах того же соединения.

1 голос
/ 27 июня 2019

Ваш запрос действительно произвольный. MySQL не гарантирует порядок вычисления выражений в select. Также это не гарантирует порядок набора результатов.

Итак, я думаю, вы хотите:

select p.*,
       (@rn := if(@id = id, @rn + 1,
                  if(@id := id, 1, 1)
                 )
       ) as serial
from (select p.*
      from places p
      order by p.id
     ) p cross join
     (select @id := 0, @rn := 0) params;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...