Go言語(プログラミング)入門メモ㉛(㉙のおさらい)

## 入門メモ㉙で使用した標準パッケージの使い方のおさらい。
急にたくさんの関数やメソッドがでてきてパニックになってしまったのでおさらいをする。

## 入門メモ㉙データベースについて
まず、コード全体は以下。
~~~
package main

import (
	"database/sql"
	"log"

	_ "github.com/mattn/go-sqlite3"
)

var DbConnection *sql.DB

type Person struct {
	Name string
	Age  int
}

func main() {
	DbConnection, _ := sql.Open("sqlite3", "example.sql")
	defer DbConnection.Close()

	cmd := `CREATE TABLE IF NOT EXISTS person (
        name TEXT,
        age INT
        )`
	_, err := DbConnection.Exec(cmd)
	if err != nil {
		log.Fatalln(err)
	}

	cmd = "DELETE FROM person WHERE name = ?"
	_, err = DbConnection.Exec(cmd, "Nancy")
	if err != nil {
		log.Fatalln(err)
	}

}
~~~

## importセクション
■database/sql パッケージ

概要：Go言語の標準パッケージで、データベースとやり取りするための汎用的なインターフェースを提供します。

主な機能：データベースへの接続、クエリの実行、トランザクションの管理など。

■_ "github.com/mattn/go-sqlite3"

概要：SQLiteデータベースを使用するためのドライバパッケージをインポートしています。

_（ブランクインポート）とは？

目的：パッケージ内のinit()関数を実行するためにインポートしますが、直接そのパッケージ内の関数や変数を使用しない場合に使います。

効果：ドライバをdatabase/sqlパッケージが認識できるようになります。

## グローバルセクション
■グローバル変数の宣言
~~~
var DbConnection *sql.DB
~~~
DbConnection：データベース接続を保持する変数です。

型：*sql.DBは、Go言語のdatabase/sqlパッケージに定義されているデータベースへのクエリの実行やトランザクションの管理を行います。

ポインタ：*sql.DBはポインタ型で、データベース接続のアドレスを格納しています。ポインタを使うことで、データベース接続を効率的に共有し、メモリ使用量を抑えます。

■構造体の定義
~~
type Person struct {
    Name string
    Age  int
}
~~

## main関数内
### データベースへの接続
■sql.Open(driverName, dataSourceName) 関数

目的：指定したデータベースドライバとデータソースに対して新しいデータベース接続を開きます。

■引数

driverName：使用するデータベースドライバの名前。ここでは "sqlite3" を指定しています。

dataSourceName：データソースの名前。ここでは "example.sql" ファイル（データベースファイル）のことです。

■戻り値

*sql.DB：データベースへのプールされた接続を表すオブジェクト。

error：エラー情報。

注意点：sql.Openは実際にはデータベースへの接続を確立しません。接続の確立は、最初のクエリが実行されたときに遅延して行われます。

### SQLコマンドの実行①
該当箇所のコードは以下。
~~~
cmd := `CREATE TABLE IF NOT EXISTS person (
        name TEXT,
        age INT
        )`
_, err := DbConnection.Exec(cmd)
if err != nil {
    log.Fatalln(err)
}
~~~
■DbConnection.Exec(query, args...) メソッド
目的：データベースに対してクエリを実行します。INSERT, UPDATE, DELETE, CREATE TABLE などのSQLコマンドに使用されます。

引数

query：実行するSQLクエリ文字列。

args...：クエリ内のプレースホルダー（?）にバインドされる引数。

戻り値

sql.Result：クエリの結果（影響を受けた行数など）を表すオブジェクト。

error：エラー情報。

エラーハンドリング

if err != nil { ... }

クエリの実行中にエラーが発生した場合、エラーメッセージを出力してプログラムを終了します。

### SQLコマンドの実行②(プレースホルダーの使用)
コードは以下
~~~
cmd = "DELETE FROM person WHERE name = ?"
_, err = DbConnection.Exec(cmd, "Nancy")
if err != nil {
    log.Fatalln(err)
}
~~~
■プレースホルダー（?）

目的：SQLインジェクションを防ぐために、クエリ内で直接値を結合するのではなく、プレースホルダーを使用します。

使い方：クエリ内の?に対して、Execメソッドの可変引数args...として値を渡します。

この例の説明

クエリ："DELETE FROM person WHERE name = ?"は、personテーブルから特定の名前のレコードを削除します。

引数："Nancy"が?にバインドされ、クエリが実行されます。

## データベースとの接続処理の流れ
1.データベースドライバのインポート

使用するデータベースに対応したドライバパッケージをインポートします。

通常、ブランクインポート（_ "package_name"）を使用して、database/sqlパッケージがドライバを認識できるようにします。

データベースへの接続

sql.Open(driverName, dataSourceName)を使用して、データベースへの接続を開きます。

deferを使って、プログラム終了時に接続を閉じることを忘れないようにします。

2.クエリの実行

データを変更するクエリ（Execメソッド）

Exec(query, args...)を使用して、INSERT, UPDATE, DELETE, CREATE TABLEなどの操作を行います。

プレースホルダー（?）を使用して、ユーザー入力などの値を安全にクエリに組み込みます。

3.データを取得するクエリ（QueryやQueryRowメソッド）

Query(query, args...)やQueryRow(query, args...)を使用して、データを取得します。

結果セットを処理するために、RowsやRowオブジェクトを使用します。

4.エラーハンドリング

すべてのデータベース操作において、エラーが発生する可能性があります。

if err != nil { ... }の形でエラーを確認し、適切に対処します。

5.接続のクローズ

プログラムが終了する前に、必ずデータベース接続を閉じます。

接続を閉じないと、リソースリークが発生し、パフォーマンスや安定性に影響を与えます。