第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

使用 pgx 和 go 在簡(jiǎn)單的 postgresql 查詢(xún)中返回 id

使用 pgx 和 go 在簡(jiǎn)單的 postgresql 查詢(xún)中返回 id

Go
哈士奇WWW 2022-11-08 16:59:06
我正在嘗試運(yùn)行這個(gè)簡(jiǎn)單的查詢(xún)來(lái)返回 id,根據(jù)作者的說(shuō)法,我們使用 QueryRow 函數(shù),好的,但是這個(gè)查詢(xún)結(jié)果返回了一個(gè)期望 2 個(gè) args 但在這里某處收到 3 個(gè)錯(cuò)誤。查詢(xún)模型.go type WidgetetModel struct {    DB *pgxpool.Pool}func (m *WidgetModel) Insert(title, content, expires string) (int, error) {        stmt := `INSERT INTO widgets (title, content, created, expires) VALUES($1, $2, NOW(), NOW() + INTERVAL '$3 day') RETURNING id;`            var id int        err := m.DB.QueryRow(context.Background(), stmt, title, content, expires).Scan(&id)        if err != nil {            if errors.Is(err, sql.ErrNoRows) {                return 0, models.ErrNoRecord            } else {                return 0, err            }        }            return 0, nil    }處理程序.gofunc (app *application) createWidget(w http.ResponseWriter, r *http.Request) {    if r.Method != http.MethodPost {        w.Header().Set("Allow", http.MethodPost)        app.clientError(w, http.StatusMethodNotAllowed) // Use the clientError() helper.        return    }    title := "Widget 1"    content := "Some content here..."    expires := "7"    id, err := app.widgets.Insert(title, content, expires)    if err != nil {        app.serverError(w, err) <-- line 57        return    }    http.Redirect(w, r, fmt.Sprintf("/widget?id=%v", id), http.StatusSeeOther)}main.go我只是在這里使用一個(gè)結(jié)構(gòu)來(lái)為我的處理程序注入依賴(lài)項(xiàng)。dbPool, err := openDB(*dsn)    if err != nil {        errorLog.Fatal(err)    }    defer dbPool.Close()app := &application{        errorLog: errorLog,        infoLog:  infoLog,        snippets: &postgresql.WidgetModel{DB: dbPool},}///func openDB(dsn string) (*pgxpool.Pool, error) {    pool, err := pgxpool.Connect(context.Background(), dsn)    if err != nil {        return nil, err    }    if err = pool.Ping(context.Background()); err != nil {        return nil, err    }    return pool, nil}
查看完整描述

2 回答

?
哆啦的時(shí)光機(jī)

TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個(gè)贊

從您收到的錯(cuò)誤中:

expected 2 arguments, got 3

我懷疑$3在 SQL 引號(hào)內(nèi)的查詢(xún)中不會(huì)被解釋為參數(shù)。另外據(jù)我所知,這不是在 postgres 中使用參數(shù)間隔的正確方法。正確的方法是寫(xiě)interval '1 day' * $1

所以我認(rèn)為如果您將代碼更改為:

stmt := `INSERT INTO widgets (title, content, created, expires) VALUES($1, $2, NOW(), NOW() + INTERVAL '1 day' * $3) RETURNING id;`

它會(huì)起作用的。但請(qǐng)確保將expires參數(shù)更改為 int 類(lèi)型。


查看完整回答
反對(duì) 回復(fù) 2022-11-08
?
當(dāng)年話下

TA貢獻(xiàn)1890條經(jīng)驗(yàn) 獲得超9個(gè)贊

'$3 day' 您不能將查詢(xún)參數(shù)作為字符串文字的一部分傳遞。


嘗試將所有INTERVAL '$3 day'部分替換為參數(shù)。像這個(gè)。


func (m *WidgetModel) Insert(title, content, expires string) (int, error) {

    stmt := `

INSERT INTO widgets (title, content, created, expires)

VALUES ($1, $2, NOW(), NOW() + $3)

RETURNING id;`


    var id int

    expiresDays, err := strconv.ParseInt(expires, 10, 32)

    if err != nil {

        return 0, err

    }

    expiresInterval := pgtype.Interval{

        Days:   int32(expiresDays),

        Status: pgtype.Present}

    err = m.DB.QueryRow(context.Background(), stmt, title, content,

        expiresInterval).Scan(&id)

    if err != nil {

        if errors.Is(err, sql.ErrNoRows) {

            return 0, models.ErrNoRecord

        } else {

            return 0, err

        }

    }


    return 0, nil

}


查看完整回答
反對(duì) 回復(fù) 2022-11-08
  • 2 回答
  • 0 關(guān)注
  • 215 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)