GO 연결 데이터베이스

12570 단어 go.
프로필 은 Go 에서 데이터 베 이 스 를 연결 하 는 방식 이 매우 많 습 니 다.여기 서 저 희 는 ORM 을 사용 하 는 방식 을 선택 하 였 습 니 다.
원생 SQL 문 구 를 쓰 지 않 아 도 됩 니 다.
Go 의 ORM 라 이브 러 리 도 많 습 니 다.여 기 는 gorm 을 선 택 했 습 니 다.
gorm 설치
go get -u github.com/jinzhu/gorm

데이터베이스 데이터 베 이 스 를 시작 하여 가장 주류 인 my sql 을 선택 하 였 습 니 다.
데이터 베 이 스 를 만 드 는 방식 은 매우 많 습 니 다.정리 하기 편리 하도록 docker 를 사용 하여 데이터 베 이 스 를 만 드 는 것 을 선택 하 십시오.
새 docker-compose.yml 파일 을 만 듭 니 다.루트 디 렉 터 리 아래:
version: "3.7"

services:
  mysql:
    image: mysql:8
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ROOT_PASSWORD: 1234
    ports:
      - 3306:3306

  adminer:
    image: adminer:4
    ports:
      - 8080:8080

  dbclient:
    image: mysql:8
    command: mysql -hmysql -uroot -p
    # source /home/script/db.sql
    # select * from tb_users \G;
    volumes:
      - ./script:/home/script

다음 명령 을 실행 하여 배경 에서 데이터 베 이 스 를 시작 합 니 다:
docker-compose up -d mysql

다음 명령 을 사용 하여 msyql 의 cli 에 연결 합 니 다:
docker-compose run --rm dbclient

비밀 번 호 를 입력 하 라 는 것 을 알려 줍 니 다.비밀 번 호 는 1234(my sql 의 환경 변수 MYSQLROOT_PASSWORD 에 설 정 됨).
그리고 cli 에 다음 SQL 을 입력 하여 표를 만 듭 니 다.
CREATE DATABASE IF NOT EXISTS `db_apiserver`;

이제 Go 코드 를 보완 할 수 있 습 니 다.
데이터 베 이 스 를 루트 디 렉 터 리 에 연결 하여 model 폴 더 를 만 듭 니 다.데이터 모델 과 데이터 베 이 스 를 정의 하 는 초기 연결 입 니 다.
model 디 렉 터 리 아래 init.go 파일 을 만 들 고 데이터베이스 연결 을 초기 화 합 니 다.
package model

import (
    "fmt"

    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
    "github.com/sirupsen/logrus"
    "github.com/spf13/viper"
)

type Database struct {
    Self *gorm.DB
}

//   
var DB *Database

func (db *Database) Init() {
    DB = &Database{
        Self: GetDB(),
    }
}

func (db *Database) Close() {
    DB.Self.Close()
}

func openDB(username, password, addr, name string) *gorm.DB {
    config := fmt.Sprintf(
        "%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=%t&loc=%s",
        username,
        password,
        addr,
        name,
        true,
        // "Asia%2FShanghai",  //     url.QueryEscape  
        "Local",
    )
    db, err := gorm.Open("mysql", config)
    if err != nil {
        logrus.Fatalf("       .      : %s.     : %s", name, err)
    } else {
        logrus.Infof("       ,      : %s", name)
    }

    setupDB(db)
    return db
}

func setupDB(db *gorm.DB) {
    db.LogMode(viper.GetBool("gormlog"))
    //             ,    0     .        ,            mysql  too many connections   。
    //db.DB().SetMaxOpenConns(20000)
    //           .                                   。
    db.DB().SetMaxIdleConns(0)
}

func InitDB() *gorm.DB {
    return openDB(
        viper.GetString("db.username"),
        viper.GetString("db.password"),
        viper.GetString("db.addr"),
        viper.GetString("db.name"),
    )
}

func GetDB() *gorm.DB {
    return InitDB()
}
       ,             , mysql        :

"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
                  	*gorm.DB ,        :

type Database struct {
    Self *gorm.DB
}

//   
var DB *Database
                   .

                ,         config.yaml         :

db:
  name: db_apiserver
  addr: 127.0.0.1:3306
  username: root
  password: "1234"
           
  runServer           :

//       
model.DB.Init()
defer model.DB.Close()
  
              ,                      ,

      docker   ,            ,           .

좋은 웹페이지 즐겨찾기