GO 연결 데이터베이스
                                            
 12570 단어  go.
                    
원생 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   ,            ,           .
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
go 의 값 전달 과 참조 전달절편 과 지 도 는 모두 인용 유형 이다.현지에서 새로운 변수 로 할당 되 었 을 때 같은 내부 데이터 구 조 를 가리킨다.따라서 그 중의 한 변 수 를 바 꾸 면 다른 변수 에 영향 을 줄 수 있다. 다음은 참조 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.