DRYな備忘録

Don't Repeat Yourself.

Go言語`database/sql`パッケージのplaceholderが効かない【小学生は最高だぜ】

問題

Go言語でMySQLを使う案件があったので、Goに標準のdatabase/sqlパッケージを使う(あとgithub.com/go-sql-driver/mysqlパッケージも)。問題はdatabase/sqlパッケージの*sql.DBが持ってるQueryメソッドがデフォルトで実装しているplaceholder機能を以下のように使おうとした

db, _ := sql.Open("mysql", "myuser:mypass@tcp(localhost:3306)/mydb")
rows, e := db.Query("SELECT * FROM ? WHERE age < ?","users",12)
fmt.Println(rows, e)

その結果

<nil>
Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? WHERE age > ?' at line 1

あらまあ

原因

テーブル名にはplaceholder使えないようだ

解決

db, _ := sql.Open("mysql", "myuser:mypass@tcp(localhost:3306)/mydb")
rows, e := db.Query("SELECT * FROM users WHERE age < ?",12)
fmt.Println(rows, e)

その結果

&{dc:0xc21004fa20 releaseConn:0xd6c20 rowsi:0xc21000a5a0 closed:false lastcols:[] lasterr:<nil> closeStmt:<nil>}
<nil>

取れてるっぽい。

せっかくなので

出力してみた

query := "SELECT * FROM users WHERE age < ?"
rows, _ = p.db.Query(query, 12)
for rows.Next() {
    var name string
    var age int
    _ = rows.Scan(&name, &age)
    fmt.Printf("%s\t%d\n", name, age)
}
ともか  11
まほ    11
さき    11
ひなた  11
あいり  11
みみ    10
つばき  10
ひいらぎ        10
かげつ  10
まさみ  10

雑感

まったく、小学生は最高だぜ!!

f:id:otiai10:20130810204714j:plain

なお当方、三沢真帆推しです

DRY