情報収集と表示用途でデータベースを使ってみます。
データベース選定からGOでテストを動かすまでの備忘録。
実施環境はWindows10(64bit)です。
DBの準備
DB選定
まずは用途から通常のRDBかNoSQLかを考える。
なんとなく記憶にあるものを上げるとこんな感じでした。
- RDB : Oracle、MySQL、PostgreSQL、SQLite、IBM DB2、MS SQL
- NoSQL : MongoDB、AWS Dynamo、Google BigTable
調べてみるとNoSQLではRedis、Apache Cassandraというのも人気がみたいです。いわれてみると見覚えある。
仕事でもないし太字で書いたオープンソースのものを使いたい。
今回は色々とってきて組み合わせて使いたいのでRDBから選択する。
SQLiteは簡単で管理しやすい反面、小規模向けという印象がある。
今回はMySQLかPostgreSQLのどちらでもよかったので人気のありそうな方を選ぶ。
こういう時の定番でGitHubで検索。
GitHub Link | Repository | with GO |
MySQL | 126,129 | 1,956 |
PostgreSQL | 28,741 | 881 |
SQLite | 3,4614 | 333 |
MySQLを使うことにします。
DBインストール
Windowsにmysqlを入れてなかったのでインストール。
インストーラは32bitしかありませんが、これで64bitもインストールされます。
インストーラを選択後ログインを求められますが、アカウントがなくても下のリンクからダウンロード可能です。
インストーラはデフォルトのまま進めました。
途中Python3.7がないといわれましたが、3.5.2は入ってたので無視して続ける。
MySQL DBの設定
上部アイコンからテスト用スキーマを作成します。
ナビゲータ下のタブを切り替えて先ほど作成したスキーマを確認。
Table部分で右クリックから「Create Table」を選択します。
出来上がったTableを右クリックして「Select Rows – Limit 100」をクリックすると空の票が表示されます。
適当に入力して「Apply」を押すことでインサートできます。
ここまで1つも自分でSQLを書いていません。楽ですね。
Goでデータベースアクセス
DBドライバとSQLの2種類のパッケージが必要になります。
SQLの方は色々ありますが最初はデフォルトの”database/sql”を使います。
ドライバの方はgetする必要があります。
1 |
go get github.com/go-sql-driver/mysql |
元号に令和を入れて一覧を取得してみます。
db部分のtcpは今回はどれでもOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) func main() { //db, err := sql.Open("mysql", "root:password@tcp(127.0.0.1:3306)/test_schema") //db, err := sql.Open("mysql", "root:password@tcp(localhost:3306)/test_schema") db, err := sql.Open("mysql", "root:password@/test_schema") if err != nil { panic(err.Error()) } defer db.Close() _, err = db.Exec("INSERT INTO `test_schema`.`gengo` (`gengo`, `yomi`, `ad`) VALUES ('令和', 'reiwa', '2019');") rows, _ := db.Query("SELECT * FROM gengo ORDER BY ad") columns, _ := rows.Columns() values := make([]sql.RawBytes, len(columns)) scanArgs := make([]interface{}, len(values)) for i := range values { scanArgs[i] = &values[i] fmt.Printf("%8s", columns[i]) } fmt.Println("\n------------------------") for rows.Next() { err = rows.Scan(scanArgs...) if err != nil { panic(err.Error()) } var value string for _, col := range values { if col == nil { value = "NULL" } else { value = string(col) } fmt.Printf("%8s", value) } fmt.Println() } /* gengo yomi ad ------------------------ 大正 taisho 1912 昭和 showa 1926 平成 heisei 1989 令和 reiwa 2019 */ } |
Openのサンプルでdbnameやdatabase_nameとか書かれていて最初は「Local instance MySQL80」とか入れて混乱してましたが、普通にスキーマ名でいいです。
Workbenchの方を見てみるとちゃんと令和が追加されていました。