【Go】始め‐DBに接続

Go Go

概要

前提

Database : Mysql
User : exampleuser
Password: examplepass
Database Name : exampledb
Database ローカル環境にDockerを利用して立ち上げて置く。以下にMysqlを起動する簡単なdocker-compose.ymlを残します、こちらに関しては別の記事を書きたいと思います。

$ cat docker-compose.yml
version: '3.8'

services:
  mysql:
    image: mysql:latest
    container_name: mysql_server
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword  # MySQLルートパスワード
      MYSQL_DATABASE: exampledb          # MySQLデータベース名
      MYSQL_USER: exampleuser            # MySQLユーザー名
      MYSQL_PASSWORD: examplepass        # MySQLユーザーパスワード
    ports:
      - "3306:3306"  # ホスト:コンテナ (MySQL)

プログラミングする

mainモジュールを作成し「github.com/go-sql-driver/mysql」をインポートしてMysqlに接続してみます。

$ mkdir example-db
$ go mod init example.com/example-db
go: creating new go.mod: module example.com/example-db

$ go get github.com/go-sql-driver/mysql
go: added filippo.io/edwards25519 v1.1.0
go: added github.com/go-sql-driver/mysql v1.8.0

$

Databaseべつモジュール

DBエンジンDriver
Mysqlgithub.com/go-sql-driver/mysql
Postgresqlgithub.com/lib/pq
Sqlitegithub.com/mattn/go-sqlite3
Oracledatabase/sql
github.com/godror/godror
MSSqlgithub.com/microsoft/go-mssqldb
mongoDBgi.mongodb.org/mongo-driver/mongo

ソースを作成

$ vi main.go
package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/go-sql-driver/mysql"
)

func main() {
	_, err := sql.Open("mysql", "exampleuser:examplepass@tcp/exampledb")
	if err != nil {
		log.Fatalln(err)
	}

	fmt.Println("db connected !")
}

main.goに以下を追加してテーブルの生成を試します。

	_, err = db.Exec(`CREATE TABLE users (
				id INT AUTO_INCREMENT,
				name VARCHAR(255) NOT NULL,
				email VARCHAR(255) NOT NULL,
				PRIMARY KEY (id));`)
	if err != nil {
		log.Fatalln(err)
	}
	fmt.Println("created table!")

テーブルの生成の代わりに以下の例で修正してユーザーの挿入を試します。

	_, err = db.Exec(`INSERT INTO users (name, email)
				VALUES ('user01','user01@example.com');`)
	if err != nil {
		log.Fatalln(err)
	}
	defer db.Close()

	fmt.Println("insert into user !")

ユーザー挿入の代わりに以下の例で修正して挿入したユーザーをクエリーしてみましょう。

	results, err := db.Query(`SELECT id, name, email from users;`)
	if err != nil {
		log.Println(err)
	}
	defer results.Close()

	user := User
	for results.Next() {
		err := results.Scan(&user.Id, &user.Name, &user.Email)
		if err != nil {
			log.Fatalln(err)
		}
		fmt.Println(user.Id, user.Name, user.Email)
	}

クエリーの結果

$ go run .
db connected !
1 user01 user01@example.com

お疲れさん!!

タイトルとURLをコピーしました