Как получить последний вставленный идентификатор с драйвером GO-MSSQLDB? - PullRequest
0 голосов
/ 26 октября 2018

Я понял, что SQL Server не возвращает последний вставленный идентификатор автоматически, и мне нужно сделать это вручную с помощью: OUTPUT INSERTED.ID в операторе SQL insert.

Как мне получить его позже в Go code?

Рассматриваемая функция:

    func (sta *state) mkLogEntry(from time.Time, to time.Time, man bool) (id int64) {
    qry := "INSERT INTO ROMEExportLog(FromDate,ToDate,ExecutedAt,ExecutedManually,ExportWasSuccessful,UpdatedDaysIrregular) OUTPUT INSERTED.ID " +
        "VALUES(@FromDate,@ToDate,@ExecutedAt,@ExecutedManually,@ExportWasSuccessful,@UpdatedDaysIrregular)"
    res, err := sta.db.Exec(qry,
        sql.Named("FromDate", from),
        sql.Named("ToDate", to),
        sql.Named("ExecutedAt", time.Now()),
        sql.Named("ExecutedManually", man),
        sql.Named("ExportWasSuccessful", false),
        sql.Named("UpdatedDaysIrregular", false),
    )
    if err != nil {
        log.Fatal(err)
    }
    id, err = res.LastInsertId()

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

res.LastInsertId() возвращает There is no generated identity value.

1 Ответ

0 голосов
/ 26 октября 2018

Причина этого в том, что PostgreSQL не возвращает вам последний вставленный идентификатор. Это связано с тем, что последний вставленный идентификатор доступен только в том случае, если вы создаете новую строку в таблице, которая использует последовательность.

Если вы на самом деле вставляете строку в таблицу, где назначена последовательность, вы должны использовать предложение RETURNING. Как то так: INSERT INTO table (name) VALUES("val") RETURNING id.

Я не уверен в вашем драйвере, но в pq вы сделаете это следующим образом:

lastInsertId := 0
err = db.QueryRow("INSERT INTO brands (name) VALUES($1) RETURNING id", name).Scan(&lastInsertId)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...