Go 초보자는 Golang과 MySQL을 연결해서 API를 만들어 보십시오.

17282 단어 MySQLGoDog초보자

개요

  • 며칠 전DOG#2 강단에 올랐을 때의 견해는 Qiita
  • 로 요약된다
  • 실제 무대에 올랐을 때슬라이드
  • 소스 코드 상승GitHub
  • 주의사항

  • 슬라이드에서 보듯이 Go를 터치한 시간은 당시 15시간 정도의 초초보자
  • 그때는 어쨌든 이동을 첫 번째 목적으로 만들었기 때문에 아직 구멍이 많다고 생각했다
  • 전제 조건

  • 버전은 다음과 같습니다.
  • Go:go1.12.6 darwin/amd64
  • MySQL:5.7.26
  • 로컬 환경에서 구현
  • 흐르다

  • 만들고 싶은 것에 대한 설명
  • Go로 MySQL 연결
  • 환경 변수 설정
  • 공용 파일에 SQL 연결 처리 요약
  • Json 형식으로 반환되는 웹 API 만들기
  • 세부 정보


    1. 만들고 싶은 것에 대한 설명

  • 2019년 현재 나의 개인 열풍은 장기(초초보자)
  • 동료를 가리킬 때의 승패 결과와 내용을 관리하고 싶다(전법/포위)
  • 여기는 전법(영어로는 오픈닝이라고 부른다)의 일람을 목표로 한다
  • MySQL 데이터는 다음과 같이 준비되었습니다.
  • 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)))
    }
    

    실제 반환 여부 확인



    나는 순조롭게 반환했다.기쁘고 축하할 만하다

    요약(또는 소감?)

  • 많은 것에 빠졌지만 당분간 간단한 WEB API를 만들 수 있을 것 같다
  • 환경 변수의 설정, json으로의 전환이 비교적 쉽다
  • 라이브러리의 효과적인 이용 여부는 공식 문서를 얼마나 읽을 수 있느냐에 달려 있다
  • 회사에서 한다면 라이브러리의 기술 선정이 중요하다고 생각한다
  • 아직 정리할 점이 많다고 생각해서 계속 설치하고 싶어요
  • 참조 링크


    Go에서 MySQL 연결
    Package sql
    가져오기 선언
    pkg 설명
    Go는 디렉터리 구성의 기준이 있는 것 같습니다.
    Go 언어에서 gorilla/mux를 사용하는 간단한 네트워크 응용 프로그램 예시
    Go 언어로 서버 제작에 필요한 지식 노트

    좋은 웹페이지 즐겨찾기