1

次の表があります。

CREATE TABLE Users (
  user_id BIGSERIAL PRIMARY KEY,
  email VARCHAR(50) NOT NULL,
  password_hash VARCHAR(100) NOT NULL,
  points INT DEFAULT 0,
  created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
)

電子メールとパスワードを受け取り、パスワードを暗号化し、それらをテーブルに挿入しようとします。

import (
  _ "github.com/lib/pq"
  "database/sql"
  "code.google.com/p/go.crypto/bcrypt"
)

conn := OpenConnection()
defer conn.Close()
email := r.FormValue("email")
password, _ := bcrypt.GenerateFromPassword([]byte(r.FormValue("password")), bcrypt.DefaultCost)
res, err := conn.Exec("INSERT INTO users (email, password_hash) VALUES (?, ?)", email, password)
http.Redirect(w, r, "/", http.StatusFound)

インサートは を投げるpq: P:"51" S:"ERROR" L:"1002" C:"42601" M:"syntax error at or near \",\"" F:"scan.l" R:"scanner_yyerror"。バイト型のパスワードを単純な文字列に置き換えると、同じエラーがスローされます。

私は何を間違っていますか?

4

1 に答える 1

2

リンクがなくなった場合に備えて、回答として投稿します:https://github.com/lib/pq/issues/65から

by dpapathanasiou : 私は問題を理解しました。pq のバグではありませんが、プリペアド ステートメントを作成する方法に問題があります。? の代わりに ($n) を使用する必要があります。バインドされたパラメーター用。

したがって、これらのステートメントはすべて正しく機能します。

stmt, err := db.Prepare("select id from people where firstname = ($1) and lastname = ($2)")
stmt, err := db.Prepare("select id from people where firstname ~* ($1) and lastname ~* ($2)")
stmt, err := db.Prepare("select id from people where firstname = ($1)")
于 2013-04-29T06:36:03.367 に答える