Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

Go言語でのPost/Getとデータベース連携

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


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