Go 초보자는 Golang과 MySQL을 연결해서 API를 만들어 보십시오.
개요
주의사항
전제 조건
흐르다
세부 정보
1. 만들고 싶은 것에 대한 설명
shogi
데이터베이스에서 생성opening
표+------------+-----------------+
| opening_id | name |
+------------+-----------------+
| 1 | なし |
| 2 | 居飛車棒銀 |
| 3 | 三間飛車 |
| 4 | 四間飛車 |
| 5 | 向い飛車 |
| 6 | 中飛車 |
+------------+-----------------+
2. Go 연결 MySQL
참조 Go에서 MySQL 연결 및 Package sql 를 허용하십시오.
내 SQL 패키지 설치
$ go get -u github.com/go-sql-driver/mysql
ySQL 연결 확인
mysqltest.go
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "****:****@/shogi")
if err != nil {
log.Fatal(err)
}
defer db.Close()
id := 3
var name string
err = db.QueryRow("SELECT name FROM opening WHERE opening_id = ?", id).Scan(&name)
if err != nil {
log.Fatal(err)
}
fmt.Println(name)
}
연결 결과
mysqltest $ go build
mysqltest $ ./mysqltest
三間飛車
이렇게 하면 순조롭게 얻을 수 있다환경 변수 설정
데이터베이스 비밀번호를git 관리에 두는 것은 좋지 않습니다.
개인 개발은 괜찮은데 회사에서 이런 걸 쓰면 댓글의 폭풍우...
.env 파일에서 설정합니다.
godotenv 패키지 설치
go get github.com/joho/godotenv
.env 설정
DB_NAME=shogi
DB_ROLE=****
DB_PASSWORD=****
.env 로드 및 반영
mysqltest.go
// "os" "github.com/joho/godotenv" をそれぞれインポートしてください
func main() {
err := godotenv.Load()
if err != nil {
log.Fatal(err)
}
db, err := sql.Open("mysql", os.Getenv("DB_ROLE") + ":"+os.Getenv("DB_PASSWORD") + "@/" + os.Getenv("DB_NAME"))
// 以下割愛
이제 원본 코드에 비밀번호를 넣을 필요가 없습니다.4. 공용 파일에 SQL 연결 처리만 요약
만약 단지 하나의 파일일 뿐이라면 이렇게
main.go
하면 된다매번 연결할 때마다 연결 처리를 쓰는데 솔직히 안 좋아요.
연결 처리만 잘라냅니다,main.go는 그것을 호출하기만 하면 된다.
처리 파일의 배치 위치 결정
project-layout을 읽고
pkg/
밑에 두기로 했다.공동 처리
성공 시 데이터베이스 유형을 반환하기 위해 SQL 연결
pkg/db/connect.go
func Connect() *sql.DB {
err := godotenv.Load()
if err != nil {
panic(err.Error())
}
db, err := sql.Open("mysql", os.Getenv("DB_ROLE") + ":"+os.Getenv("DB_PASSWORD") + "@/"+os.Getenv("DB_NAME"))
if err != nil {
panic(err.Error())
}
return db
}
공용 프로세스 호출
데이터의 취득 처리 자체도
pkg/dao/opening/openingdao.go
로 잘라낸다.(이것은 공동 처리라기보다는 업무 논리에서 분리된 결과이다)
구조 슬라이스에 데이터를 저장하고 되돌려줍니다.
pkg/dao/opening/openingdao.go
package openingdao
import (
"github.com/hunhunyosshy/black-and-white/pkg/db"
)
//Opening型の構造体を用意します
//あとでjson形式にするので、jsonのタグをあらかじめつけておきます
type Opening struct {
ID int `json:"id"`
Name string `json:"name"`
}
func FetchIndex() []Opening {
db := db.Connect()
defer db.Close()
//rowを取得
rows, err := db.Query("SELECT * FROM opening")
if err != nil {
panic(err.Error())
}
//Opening型のスライスに格納します
openingArgs := make([]Opening, 0)
for rows.Next() {
var opening Opening
err = rows.Scan(&opening.ID, &opening.Name)
if err != nil {
panic(err.Error())
}
openingArgs = append(openingArgs, opening)
}
return openingArgs
}
5. Json 형식으로 반환되는 웹 API 만들기
API로 사용할 수 있도록 URI를 치면 Json으로 반환합니다.
이번에는 Gorilla/mux라는 라이브러리에서 루트 처리를 시도했습니다.
(겸사겸사 채용 이유는 예전에 고리라는 별명이 생겨서 친근감이 있어서)
gorilla/mux 패키지 설치
go get -u github.com/gorilla/mux
Json으로 돌아가기
main.go
package main
import (
"encoding/json"
"log"
"net/http"
"github.com/gorilla/mux"
openingdao "github.com/hunhunyosshy/black-and-white/pkg/dao/opening"
)
func main() {
r := mux.NewRouter()
// localhost:8080/opening/ で戦法の一覧を取得できるようにします
r.HandleFunc("/opening/", showOpeningIndex)
log.Fatal(http.ListenAndServe(":8080", r))
}
func showOpeningIndex(w http.ResponseWriter, r *http.Request) {
opening := openingdao.FetchIndex()
//json形式に変換します
bytes, err := json.Marshal(opening)
if err != nil {
log.Fatal(err)
}
w.Write([]byte(string(bytes)))
}
실제 반환 여부 확인
나는 순조롭게 반환했다.기쁘고 축하할 만하다
요약(또는 소감?)
참조 링크
Go에서 MySQL 연결
Package sql
가져오기 선언
pkg 설명
Go는 디렉터리 구성의 기준이 있는 것 같습니다.
Go 언어에서 gorilla/mux를 사용하는 간단한 네트워크 응용 프로그램 예시
Go 언어로 서버 제작에 필요한 지식 노트
Reference
이 문제에 관하여(Go 초보자는 Golang과 MySQL을 연결해서 API를 만들어 보십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/k_yoshikawa/items/e5d35d1252bbf0040bc3
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Go 초보자는 Golang과 MySQL을 연결해서 API를 만들어 보십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/k_yoshikawa/items/e5d35d1252bbf0040bc3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)