Взаимодействие Golang и Postgres — вычитание 1 из таблицы int64 при каждом запросе

Я учусь создавать HTTP API,

Я создаю фиктивную кредитную систему API, так как это то, что меня конкретно интересует.

Вот что у меня получилось: (я использую драйвер PQ)

if !dummy.creds <= 0 {
    c.JSON(404, gin.H{
        "success": false,
        "message": "No Credits!",
    })
    return
}

Однако, скажем, я редактирую таблицу SQL, чтобы сказать 50 кредитов. Как вычесть 1 кредит каждый раз, когда запрашивается фиктивный API?

Так, например, если я делаю запрос к API, и он возвращает успешные фиктивные данные (в JSON) из таблицы SQL, как я могу вычесть один кредит, чтобы у меня было только 49 кредитов, затем 48, 47, 46 и т. д.

ОБНОВЛЕНИЕ: это то, что я придумал

_, err := db.Exec("UPDATE dummy SET creds = -1 WHERE email = $1")
if err != nil {
    log.Fatal(err)

}

Вместо того, чтобы работать, он ничего не делает.

Что я делаю не так?

Любые ответы и знания в этом были бы потрясающими!

Спасибо!


person AndrewWilliams    schedule 16.08.2018    source источник
comment
Например, вы можете использовать триггеры в postgres.   -  person mkopriva    schedule 17.08.2018
comment
@mkopriva, можете ли вы дать мне пример/ссылку на это? Не знал, с чего начать, несколько дней пытался гуглить и даже купил несколько руководств.   -  person AndrewWilliams    schedule 17.08.2018
comment
Я считаю, что вопрос в том, чтобы возвращать последовательные результаты. Тогда дело не в уходе. Речь идет о базе данных. Найдите оптимистическую блокировку и пессимистическую блокировку, выберите для обновления и т. д.   -  person Seva    schedule 17.08.2018
comment
Вот также базовое (но хорошее) введение в работу с базами данных в go (если вам это нужно): go-database-sql.org/index.html   -  person Seva    schedule 17.08.2018
comment
@Seva Это помогло мне кое-что понять, но я все еще не могу передать SQL-запрос в postgres из go. Можете ли вы проверить обновленный вопрос и посмотреть, сможете ли вы обнаружить какие-либо ошибки?   -  person AndrewWilliams    schedule 17.08.2018
comment
Прежде всего, вы не уменьшаете количество кредитов — вы устанавливаете его на -1. Во-вторых, вы объявили параметр $1, но не указали для него значение. Я считаю, что то, что вы имели в виду, должно выглядеть примерно так: userEmail:[email protected]; _, err := db.Exec(UPDATE dummy SET Creds = Creds-1 WHERE email = $1, userEmail)   -  person Seva    schedule 20.08.2018


Ответы (1)


Как написала @seva

Я считаю, что вопрос в том, чтобы возвращать последовательные результаты. Тогда дело не в уходе. Речь идет о базе данных. Поиск «оптимистическая блокировка» против «пессимистическая блокировка», «выбрать для обновления» и т. д. Вот также базовое (но хорошее) введение в работу с базами данных на ходу (если вам это нужно): go-database-sql.org/index .html

person AndrewWilliams    schedule 19.08.2018