# 5.3 SQLiteデータベースの使用

SQLiteはオープンソースの組み込み式リレーショナルデータベースです。独立しており、設定なしでトランザクションのSQLデータベースエンジンをサポートします。非常にポータブルで簡単に利用でき、コンパクトで効率が高く、信頼性があります。他のデータベース管理システムとは異なり、SQLiteのインストールと実行は非常に簡単です。多くの場合は、ただSQLiteのバイナリファイルを用意するだけですぐに作成、接続、使用することができます。もしあなたが現在組み込み式データベースかソリューションをお探しであれば、SQLいては絶対に考慮するに値します。SQLiteはいわばオープンソースのAccessのようなものです。

## ドライバ
Goがサポートするsqliteのドライバも比較的多いのですが、大部分はdatabase/sqlインターフェースをサポートしていません。

- https://github.com/mattn/go-sqlite3 database/sqlインターフェースをサポートしています。cgo(cgoに関する情報はオフィシャルドキュメントかこの本の最後の章をご参考ください)に基づいて記述されています。
- https://github.com/feyeleanor/gosqlite3 database/sqlインターフェースをサポートしていません。cgoに基いて記述されています。
- https://github.com/phf/go-sqlite3  database/sqlインターフェースをサポートしていません。cgoに基いて記述されています。

現在database/sqlをサポートしているSQLいてデータベースドライバは一つ目だけです。私も現在これを採用してプロジェクトで開発しています。標準インターフェースを採用することは今後より良いドライバが開発された時に移行できることです。

## 実例コード
例に示すデータベーススキーマは以下の通りです。対応するテーブル作成SQL：

	CREATE TABLE `userinfo` (
		`uid` INTEGER PRIMARY KEY AUTOINCREMENT,
		`username` VARCHAR(64) NULL,
		`departname` VARCHAR(64) NULL,
		`created` DATE NULL
	);

	CREATE TABLE `userdeatail` (
		`uid` INT(10) NULL,
		`intro` TEXT NULL,
		`profile` TEXT NULL,
		PRIMARY KEY (`uid`)
	);

下のGoプログラムがどのようにデータベースのテーブルのデータを操作するか見てみましょう：追加・削除・修正・検索

	package main

	import (
		"database/sql"
		"fmt"
		_ "github.com/mattn/go-sqlite3"
	)

	func main() {
		db, err := sql.Open("sqlite3", "./foo.db")
		checkErr(err)

		//データの挿入
		stmt, err := db.Prepare("INSERT INTO userinfo(username, departname, created) values(?,?,?)")
		checkErr(err)

		res, err := stmt.Exec("astaxie", "研究開発部門", "2012-12-09")
		checkErr(err)

		id, err := res.LastInsertId()
		checkErr(err)

		fmt.Println(id)
		//データの更新
		stmt, err = db.Prepare("update userinfo set username=? where uid=?")
		checkErr(err)

		res, err = stmt.Exec("astaxieupdate", id)
		checkErr(err)

		affect, err := res.RowsAffected()
		checkErr(err)

		fmt.Println(affect)

		//データの検索
		rows, err := db.Query("SELECT * FROM userinfo")
		checkErr(err)

		for rows.Next() {
			var uid int
			var username string
			var department string
			var created string
			err = rows.Scan(&uid, &username, &department, &created)
			checkErr(err)
			fmt.Println(uid)
			fmt.Println(username)
			fmt.Println(department)
			fmt.Println(created)
		}

		//データの削除
		stmt, err = db.Prepare("delete from userinfo where uid=?")
		checkErr(err)

		res, err = stmt.Exec(id)
		checkErr(err)

		affect, err = res.RowsAffected()
		checkErr(err)

		fmt.Println(affect)

		db.Close()

	}

	func checkErr(err error) {
		if err != nil {
			panic(err)
		}
	}


上のコードとMySQLの例の中のコードはほとんどまったく同じです。唯一異なるのはドライバのインポート部分です。`sql.Open`のコールではSQLiteの方法で開きます。


>sqlite管理ツール：http://sqliteadmin.orbmu2k.de/

>簡単にデータベース管理を新規作成することができます。

## links
   * [目次](<preface.md>)
   * 前へ: [MySQLデータベースの使用](<05.2.md>)
   * 次へ: [PostgreSQLデータベースの使用](<05.4.md>)
