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에 따라 라이센스가 부여됩니다.