Go 언어 (Golang)로 MySQL을 사용하여 API 만들기
머리
API를 만들 때 대규모 동시 연결을 지원하고 싶습니다.
Python의 Django에서 작성한 API를 Golang에서 다시 작성하기로 결정했습니다.
좀처럼 생각대로 움직이지 않고, 집착한 점이 많이 있었기 때문에 기록에 남긴다.
Python에서 Go 성능을 이길 수 있는지 확인
Go 환경 설정
Go 다운로드
// 確認
% go version
go version go1.16.2 darwin/amd64
// 環境情報
% go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/akidon/Library/Caches/go-build"
GOENV="/Users/akidon/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/akidon/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/akidon/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GOVCS=""
GOVERSION="go1.16.2"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Users/akidon/program/go/goAPI/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -arch x86_64 -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/qg/6f_bf3fx4qs2gxwzhbc_pks00000gn/T/go-build311814080=/tmp/go-build -gno-record-gcc-switches -fno-common"
// PATH追加
% open ~/.zshrc
다음 추가
a.zshrc#Goのパス
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$GOROOT/bin:$PATH
export PATH=$GOPATH/bin:$PATH
동작 확인
적절한 폴더에 hello.go라는 파일을 만들고 Visual Studio Code에서 아래와 같이 편집.
package main
import "fmt"
func main() {
fmt.Println("Hello!");
}
터미널에서 이전 폴더로 이동하여 go run hello.go
명령을 실행합니다. 「Hello!」라고 표시되면 성공.
% go run hello.go
Hello!
Go 패키지
Echo ... RestfullAPI 만들기 (그 밖에도 Gin, Gorilla 등이 있음)
Gorm ... MySQL을 조작하기 위해
다음 오류가 발생하면
cannot find package "github.com/hoge"
go get github.com/hoge
% go mod init go-tools
% go get github.com/labstack/echo
% go get github.com/jinzhu/gorm
% go get github.com/joho/godotenv
MySQL 다운로드
Mac 초기 설정 비망록
에서 MySQL 다운로드
% mysql.server start
// mysql.server stop でサーバー停止
# MySQLに入る
% mysql -u root
# アカウント作成
mysql> create user 'ユーザー名'@'localhost' identified by 'パスワード';
# データベース作成('golang'というDBを作成)
mysql> create database golang;
# 作成したアカウントに権限を追加
mysql> GRANT ALL ON golang.* TO 'ユーザー名'@'localhost';
mysql> exit;
SequelAce를 사용하면 MySQL 작업이 쉽습니다.
SequelAce 다운로드
Golang에서 MySQL 데이터 추가, 업데이트, 검색
MySQL 측
테이블 이름 users
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| golang | <- 作成
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
mysql> use golang;
mysql> show tables;
+------------------+
| Tables_in_golang |
+------------------+
| users |
+------------------+
mysql> desc users;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| age | int | YES | | NULL | |
| created_at | timestamp | YES | | NULL | | <- 必要
| updated_at | timestamp | YES | | NULL | | <- 必要
| deleted_at | timestamp | YES | | NULL | | <- 必要
+-------------+--------------+------+-----+---------+----------------+
SequelAce를 사용하여 이렇게 만들었습니다.
Gorm을 사용할 때 [created_at, updated_at, deleted_at]를 만들어야합니다.
Golang 측
gorm을 사용하여 MySQL을 조작하려고했지만 넘어졌습니다.
원인은 자세하게는 이해할 수 없지만, 명명이 잘못되었던 것 같다.
대문자, 소문자, 복수, 단수에 주의해 명명할 필요가 있었다.
MySQL에서는 users이지만, Golang에서 호출할 때는 "User"
MySQL에서는 name이지만, Golang에서 호출할 때는 "Name"
등 주의가 필요.
확인 동작 척은 하지 않기 때문에 에러가 나올 가능성이 있습니다
main.gopackage routing
import (
"fmt"
"github.com/labstack/echo"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
type User struct {
gorm.Model
//`json:"--"`はリクエストボディに指定する名前
Name string `json:"name"`
Age int `json:"age"`
}
func (u User) String() string {
return fmt.Sprintf("Name:%s \n Age:%d \n ",
u.Name,
u.Age)
}
// ユーザーを登録,更新
func BaseAPI_user() echo.HandlerFunc {
return func(c echo.Context) error {
db := databases.GormConnect()
defer db.Close()
//リクエストボディ
user := new(User)
user1 := User{
Name: user.Name,
Age: user.Age,}
// 追加
insertUsers := []User{user1}
insert(insertUsers, db)
// 更新
update(user1, db)
// 検索(年齢一致)
var count = search(user.Age, db)
return c.JSON(200, count)
}
}
func insert(users []User, db *gorm.DB) {
for _, user := range users {
db.NewRecord(user)
db.Create(&user)
}
}
func update(users User, db *gorm.DB) {
var user User
db.Model(&user).Where("id = ?", 1).Update(map[string]interface{}{"name": users.Name, "Age": users.Age})
}
func search(age int, db *gorm.DB) ([]User) {
var user []User
db.Raw("SELECT * FROM users WHERE age = ? ", age).Scan(&user)
return user
}
// SQLConnect DB接続
func GormConnect() (database *gorm.DB) {
// パスワード等を.envファイルから読み取る
// program > go > .env
err := godotenv.Load(fmt.Sprintf("../%s.env", os.Getenv("GO_ENV")))
if err != nil {
panic(err.Error())
} else {
fmt.Println("env読み取り成功")
}
DBMS := "mysql" // MySQL
PROTOCOL := "tcp(localhost:3306)" // db:3306
DBNAME := "" // テーブル名
USER := "" // MySQLユーザー名
PASS := "" // パスワード
CONNECT := USER + ":" + PASS + "@" + PROTOCOL + "/" + DBNAME + "?charset=utf8&parseTime=true&loc=Asia%2FTokyo"
db, err := gorm.Open(DBMS, CONNECT)
if err != nil {
panic(err.Error())
} else {
fmt.Println("DB接続成功")
}
return db
}
Reference
이 문제에 관하여(Go 언어 (Golang)로 MySQL을 사용하여 API 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/akidon0000/items/885a295b8c2ab158f865
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Go 다운로드
// 確認
% go version
go version go1.16.2 darwin/amd64
// 環境情報
% go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/akidon/Library/Caches/go-build"
GOENV="/Users/akidon/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/akidon/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/akidon/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GOVCS=""
GOVERSION="go1.16.2"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Users/akidon/program/go/goAPI/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -arch x86_64 -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/qg/6f_bf3fx4qs2gxwzhbc_pks00000gn/T/go-build311814080=/tmp/go-build -gno-record-gcc-switches -fno-common"
// PATH追加
% open ~/.zshrc
다음 추가
a.zshrc
#Goのパス
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$GOROOT/bin:$PATH
export PATH=$GOPATH/bin:$PATH
동작 확인
적절한 폴더에 hello.go라는 파일을 만들고 Visual Studio Code에서 아래와 같이 편집.
package main
import "fmt"
func main() {
fmt.Println("Hello!");
}
터미널에서 이전 폴더로 이동하여
go run hello.go
명령을 실행합니다. 「Hello!」라고 표시되면 성공.% go run hello.go
Hello!
Go 패키지
Echo ... RestfullAPI 만들기 (그 밖에도 Gin, Gorilla 등이 있음)
Gorm ... MySQL을 조작하기 위해
다음 오류가 발생하면
cannot find package "github.com/hoge"
go get github.com/hoge
% go mod init go-tools
% go get github.com/labstack/echo
% go get github.com/jinzhu/gorm
% go get github.com/joho/godotenv
MySQL 다운로드
Mac 초기 설정 비망록
에서 MySQL 다운로드
% mysql.server start
// mysql.server stop でサーバー停止
# MySQLに入る
% mysql -u root
# アカウント作成
mysql> create user 'ユーザー名'@'localhost' identified by 'パスワード';
# データベース作成('golang'というDBを作成)
mysql> create database golang;
# 作成したアカウントに権限を追加
mysql> GRANT ALL ON golang.* TO 'ユーザー名'@'localhost';
mysql> exit;
SequelAce를 사용하면 MySQL 작업이 쉽습니다.
SequelAce 다운로드
Golang에서 MySQL 데이터 추가, 업데이트, 검색
MySQL 측
테이블 이름 users
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| golang | <- 作成
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
mysql> use golang;
mysql> show tables;
+------------------+
| Tables_in_golang |
+------------------+
| users |
+------------------+
mysql> desc users;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| age | int | YES | | NULL | |
| created_at | timestamp | YES | | NULL | | <- 必要
| updated_at | timestamp | YES | | NULL | | <- 必要
| deleted_at | timestamp | YES | | NULL | | <- 必要
+-------------+--------------+------+-----+---------+----------------+
SequelAce를 사용하여 이렇게 만들었습니다.
Gorm을 사용할 때 [created_at, updated_at, deleted_at]를 만들어야합니다.
Golang 측
gorm을 사용하여 MySQL을 조작하려고했지만 넘어졌습니다.
원인은 자세하게는 이해할 수 없지만, 명명이 잘못되었던 것 같다.
대문자, 소문자, 복수, 단수에 주의해 명명할 필요가 있었다.
MySQL에서는 users이지만, Golang에서 호출할 때는 "User"
MySQL에서는 name이지만, Golang에서 호출할 때는 "Name"
등 주의가 필요.
확인 동작 척은 하지 않기 때문에 에러가 나올 가능성이 있습니다
main.gopackage routing
import (
"fmt"
"github.com/labstack/echo"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
type User struct {
gorm.Model
//`json:"--"`はリクエストボディに指定する名前
Name string `json:"name"`
Age int `json:"age"`
}
func (u User) String() string {
return fmt.Sprintf("Name:%s \n Age:%d \n ",
u.Name,
u.Age)
}
// ユーザーを登録,更新
func BaseAPI_user() echo.HandlerFunc {
return func(c echo.Context) error {
db := databases.GormConnect()
defer db.Close()
//リクエストボディ
user := new(User)
user1 := User{
Name: user.Name,
Age: user.Age,}
// 追加
insertUsers := []User{user1}
insert(insertUsers, db)
// 更新
update(user1, db)
// 検索(年齢一致)
var count = search(user.Age, db)
return c.JSON(200, count)
}
}
func insert(users []User, db *gorm.DB) {
for _, user := range users {
db.NewRecord(user)
db.Create(&user)
}
}
func update(users User, db *gorm.DB) {
var user User
db.Model(&user).Where("id = ?", 1).Update(map[string]interface{}{"name": users.Name, "Age": users.Age})
}
func search(age int, db *gorm.DB) ([]User) {
var user []User
db.Raw("SELECT * FROM users WHERE age = ? ", age).Scan(&user)
return user
}
// SQLConnect DB接続
func GormConnect() (database *gorm.DB) {
// パスワード等を.envファイルから読み取る
// program > go > .env
err := godotenv.Load(fmt.Sprintf("../%s.env", os.Getenv("GO_ENV")))
if err != nil {
panic(err.Error())
} else {
fmt.Println("env読み取り成功")
}
DBMS := "mysql" // MySQL
PROTOCOL := "tcp(localhost:3306)" // db:3306
DBNAME := "" // テーブル名
USER := "" // MySQLユーザー名
PASS := "" // パスワード
CONNECT := USER + ":" + PASS + "@" + PROTOCOL + "/" + DBNAME + "?charset=utf8&parseTime=true&loc=Asia%2FTokyo"
db, err := gorm.Open(DBMS, CONNECT)
if err != nil {
panic(err.Error())
} else {
fmt.Println("DB接続成功")
}
return db
}
Reference
이 문제에 관하여(Go 언어 (Golang)로 MySQL을 사용하여 API 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/akidon0000/items/885a295b8c2ab158f865
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
% go mod init go-tools
% go get github.com/labstack/echo
% go get github.com/jinzhu/gorm
% go get github.com/joho/godotenv
Mac 초기 설정 비망록
에서 MySQL 다운로드
% mysql.server start
// mysql.server stop でサーバー停止
# MySQLに入る
% mysql -u root
# アカウント作成
mysql> create user 'ユーザー名'@'localhost' identified by 'パスワード';
# データベース作成('golang'というDBを作成)
mysql> create database golang;
# 作成したアカウントに権限を追加
mysql> GRANT ALL ON golang.* TO 'ユーザー名'@'localhost';
mysql> exit;
SequelAce를 사용하면 MySQL 작업이 쉽습니다.
SequelAce 다운로드
Golang에서 MySQL 데이터 추가, 업데이트, 검색
MySQL 측
테이블 이름 users
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| golang | <- 作成
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
mysql> use golang;
mysql> show tables;
+------------------+
| Tables_in_golang |
+------------------+
| users |
+------------------+
mysql> desc users;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| age | int | YES | | NULL | |
| created_at | timestamp | YES | | NULL | | <- 必要
| updated_at | timestamp | YES | | NULL | | <- 必要
| deleted_at | timestamp | YES | | NULL | | <- 必要
+-------------+--------------+------+-----+---------+----------------+
SequelAce를 사용하여 이렇게 만들었습니다.
Gorm을 사용할 때 [created_at, updated_at, deleted_at]를 만들어야합니다.
Golang 측
gorm을 사용하여 MySQL을 조작하려고했지만 넘어졌습니다.
원인은 자세하게는 이해할 수 없지만, 명명이 잘못되었던 것 같다.
대문자, 소문자, 복수, 단수에 주의해 명명할 필요가 있었다.
MySQL에서는 users이지만, Golang에서 호출할 때는 "User"
MySQL에서는 name이지만, Golang에서 호출할 때는 "Name"
등 주의가 필요.
확인 동작 척은 하지 않기 때문에 에러가 나올 가능성이 있습니다
main.gopackage routing
import (
"fmt"
"github.com/labstack/echo"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
type User struct {
gorm.Model
//`json:"--"`はリクエストボディに指定する名前
Name string `json:"name"`
Age int `json:"age"`
}
func (u User) String() string {
return fmt.Sprintf("Name:%s \n Age:%d \n ",
u.Name,
u.Age)
}
// ユーザーを登録,更新
func BaseAPI_user() echo.HandlerFunc {
return func(c echo.Context) error {
db := databases.GormConnect()
defer db.Close()
//リクエストボディ
user := new(User)
user1 := User{
Name: user.Name,
Age: user.Age,}
// 追加
insertUsers := []User{user1}
insert(insertUsers, db)
// 更新
update(user1, db)
// 検索(年齢一致)
var count = search(user.Age, db)
return c.JSON(200, count)
}
}
func insert(users []User, db *gorm.DB) {
for _, user := range users {
db.NewRecord(user)
db.Create(&user)
}
}
func update(users User, db *gorm.DB) {
var user User
db.Model(&user).Where("id = ?", 1).Update(map[string]interface{}{"name": users.Name, "Age": users.Age})
}
func search(age int, db *gorm.DB) ([]User) {
var user []User
db.Raw("SELECT * FROM users WHERE age = ? ", age).Scan(&user)
return user
}
// SQLConnect DB接続
func GormConnect() (database *gorm.DB) {
// パスワード等を.envファイルから読み取る
// program > go > .env
err := godotenv.Load(fmt.Sprintf("../%s.env", os.Getenv("GO_ENV")))
if err != nil {
panic(err.Error())
} else {
fmt.Println("env読み取り成功")
}
DBMS := "mysql" // MySQL
PROTOCOL := "tcp(localhost:3306)" // db:3306
DBNAME := "" // テーブル名
USER := "" // MySQLユーザー名
PASS := "" // パスワード
CONNECT := USER + ":" + PASS + "@" + PROTOCOL + "/" + DBNAME + "?charset=utf8&parseTime=true&loc=Asia%2FTokyo"
db, err := gorm.Open(DBMS, CONNECT)
if err != nil {
panic(err.Error())
} else {
fmt.Println("DB接続成功")
}
return db
}
Reference
이 문제에 관하여(Go 언어 (Golang)로 MySQL을 사용하여 API 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/akidon0000/items/885a295b8c2ab158f865
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| golang | <- 作成
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
mysql> use golang;
mysql> show tables;
+------------------+
| Tables_in_golang |
+------------------+
| users |
+------------------+
mysql> desc users;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| age | int | YES | | NULL | |
| created_at | timestamp | YES | | NULL | | <- 必要
| updated_at | timestamp | YES | | NULL | | <- 必要
| deleted_at | timestamp | YES | | NULL | | <- 必要
+-------------+--------------+------+-----+---------+----------------+
package routing
import (
"fmt"
"github.com/labstack/echo"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
type User struct {
gorm.Model
//`json:"--"`はリクエストボディに指定する名前
Name string `json:"name"`
Age int `json:"age"`
}
func (u User) String() string {
return fmt.Sprintf("Name:%s \n Age:%d \n ",
u.Name,
u.Age)
}
// ユーザーを登録,更新
func BaseAPI_user() echo.HandlerFunc {
return func(c echo.Context) error {
db := databases.GormConnect()
defer db.Close()
//リクエストボディ
user := new(User)
user1 := User{
Name: user.Name,
Age: user.Age,}
// 追加
insertUsers := []User{user1}
insert(insertUsers, db)
// 更新
update(user1, db)
// 検索(年齢一致)
var count = search(user.Age, db)
return c.JSON(200, count)
}
}
func insert(users []User, db *gorm.DB) {
for _, user := range users {
db.NewRecord(user)
db.Create(&user)
}
}
func update(users User, db *gorm.DB) {
var user User
db.Model(&user).Where("id = ?", 1).Update(map[string]interface{}{"name": users.Name, "Age": users.Age})
}
func search(age int, db *gorm.DB) ([]User) {
var user []User
db.Raw("SELECT * FROM users WHERE age = ? ", age).Scan(&user)
return user
}
// SQLConnect DB接続
func GormConnect() (database *gorm.DB) {
// パスワード等を.envファイルから読み取る
// program > go > .env
err := godotenv.Load(fmt.Sprintf("../%s.env", os.Getenv("GO_ENV")))
if err != nil {
panic(err.Error())
} else {
fmt.Println("env読み取り成功")
}
DBMS := "mysql" // MySQL
PROTOCOL := "tcp(localhost:3306)" // db:3306
DBNAME := "" // テーブル名
USER := "" // MySQLユーザー名
PASS := "" // パスワード
CONNECT := USER + ":" + PASS + "@" + PROTOCOL + "/" + DBNAME + "?charset=utf8&parseTime=true&loc=Asia%2FTokyo"
db, err := gorm.Open(DBMS, CONNECT)
if err != nil {
panic(err.Error())
} else {
fmt.Println("DB接続成功")
}
return db
}
Reference
이 문제에 관하여(Go 언어 (Golang)로 MySQL을 사용하여 API 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/akidon0000/items/885a295b8c2ab158f865텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)