Go言語でのPost/Getとデータベース連携
今回は前回から導入したGo言語+GinでPost/Getをリクエストを受けとり、受け取ったデータをデータベースに書き込む処理について書いていきたいと思います!!
使用するデータベースはsqlite3にしました(特に理由はないですが、強いて言うなら慣れているためですw)。

Go言語やGinの導入については、こちらをご参照ください。
elsammit-beginnerblg.hatenablog.com
■Get方法
Getは前回のソースにも登場していますが、Getリクエストにて渡されたデータを受け取るところは未記載でした。
リクエストにて渡されるデータを取得する場合にはこちらのように実装すればよいです。
func Do_Get(){
r := gin.Default()
r.GET("/Get", func(c *gin.Context) {
ret := c.Query("hoge")
fmt.Println("hoge:",ret)
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run()
}こちらは、
http://アドレス:8080/Get?hoge="データ値"
のように指定してGetリクエストを行われた場合、hogeに与えられたデータ値をret変数に格納する実装になっております。
■Post方法
次にPostです。
Postにてこちらのようなjsonデータを受け取ることを想定します。
{
"Id":"1",
"Name":"namae"
}
上記jsonデータを受け取る実装はこちらになります。
type Test struct {
Id string
Name string
}
func Do_Post(){
r := gin.Default()
r.POST("/ping/", func(c *gin.Context) {
var js Test
c.BindJSON(&js)
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run()
}jsonデータと同じ構成の構造体をあらかじめ用意しておき、こちらの構造体にjsonデータを直接格納すればよいです。
■Sqlite3への書き込み
前提として、下記データベースが用意されているものとします。
DB名:db.sql テーブル名:NameTbl カラム名:id, Name
まずこちらを実行し、go言語でsqlite3を使えるようにします。
go get github.com/mattn/go-sqlite3
そして、sqlite3へのデータ書き込みはこちらになります。
DB_Write関数の引数として与えられたId, Nameをデータベースに書き込んでいます。
import (
"database/sql"
"fmt"
"log"
"github.com/gin-gonic/gin"
_ "github.com/mattn/go-sqlite3"
)
func DB_Write(Id string, Name string){
DbConnection, err1 := sql.Open("sqlite3", "./db.sql")
if err1 != nil {
log.Fatal(err1)
}
cmd := "INSERT INTO NameTbl (id, name) VALUES (?, ?)"
_, err := DbConnection.Exec(cmd, Id, Name)
if err != nil {
log.Fatalln(err)
}
} ・sql.Openでdb,sqlへのコネクション実行
・コネクションしたdb.sqlに対して、cmdで定義したコマンドを.Exec関数で実行
といった処理の流れになります。
また、コマンドに変数を与える場合には、"?"を利用しExec関数の引数として与えればよいようです。
■最後に
Go言語はまだまだ勉強中です。
写経レベルしか出来ていないので、使いながら慣れていきたいと思います。
■参考
Golang+Ginについての備忘録(ちょこっとGorm) - Qiita
(メモ)mattn/go-sqlite3を使ってみた - Qiita