2013年2月9日土曜日

Go言語でデータベースを扱う 前編

こんにちは。scarvizです。

Go言語でデータベースを扱えるようにする方法を紹介します。
go-wikiを見てみると色々ライブラリありますが、今回はMyMySQLというライブラリを使用します。

go-wiki
http://code.google.com/p/go-wiki/source/browse/SQLDrivers.wiki?repo=wiki
MyMySQL
https://github.com/ziutek/mymysql

参考にしたのはやしさんの「Androg golangからMySQLを使うには」です。
http://androg.seesaa.net/article/290624952.html

やしさんは「MySQLをインストールする方法はググれ」といってますが、僕がMySQLを入れてなかったので、入れたついでにメモしてたので、今回は前編としてMySQLをインストールするところから説明します。
実際にMyMySQLライブラリを使うのは後編になるので、今回は全然Go言語出てきません。

環境はいつものUbuntu12.04になります。




■MySQLをインストールする
以下を参考にしています。というか翻訳的な感じで解説していきます。
https://help.ubuntu.com/12.04/serverguide/mysql.html

MySQL5.5をインストールします。
sudo apt-get install mysql-server

※UbuntuServer12.04の場合はデフォルトでインストールされているそうです。

clientも一緒にインストールされます。
インストール中にMySQLのrootユーザのパスワードを求められます。
もしrootのパスワードを変更したくなったら下記コマンドで変更できるので、とりあえずでも構わないです。
sudo dpkg-reconfigure mysql-server-5.5

インストールが終わったら、MySQLサーバが起動しているか確認します。
sudo netstat -tap | grep mysql

もし
tcp        0      0 localhost:mysql         *:*                LISTEN      2556/mysqld

のような結果が帰ってきた場合、ちゃんと起動しています。
※「localhost:mysql」が「LISTEN」状態ならOKだと思います。

もし上記のような結果が返ってこなかったら、
sudo service mysql restart

を実行します。

これはMySQLサーバを再起動するコマンドです。
もし「mysql stop/waiting」(または「stop: Unknown instance:」)の後に
mysql start/running, process xxxxx

のような結果が返ってくれば再起動成功です。
もし
start: Job failed to start

が返って来ると再起動失敗です。
※こうなると原因はその状況によりけりなので、頑張って調べるしかないですね・・・。

■MySQLの初期文字コードの変更
初期状態だと文字コードがclientがutf-8、serverがlatin1になっていると思います。
とりあえずutf-8に統一しましょう。
設定ファイルを編集します(※1)。

/etc/mysql/my.cnf
を編集しますが、まずはバックアップを取りましょう。

sudo cp /etc/mysql/my.cnf /etc/mysql/back_my.cnf

適当なエディタで開いてください。
sudo gedit /etc/mysql/my.cnf

今回はMySQL5.5なので、

[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8

を設定します。(※2)

※1:
/etc/mysql/my.cnf が設定ファイルとして有効になるのは、MySQL5.1以降だそうです。

※2:
character-set-server=utf8 が有効になるのは、MySQL4以降だそうです。


■サーバアドレスの変更
MySQLサーバとして運用する場合、サーバのアドレスを設定する必要があります。
[mysqld]の設定項目の
bind-address

をサーバのアドレスに変えます。
※デフォルトでは127.0.0.1になっているので、ローカルでのみ使用するならこのままでOKですね。

変更した場合は、
sudo service mysql restart

を実行します。

■MySQLの操作
ルートユーザでMySQLサーバに接続します。
mysql -u root -p

プロンプトが「mysql>」になったと思います。
これはMySQLクライアントのプロンプトになります。
以降はこの状態でコマンドを入力していきます。

さっき文字コードを変更したので、ちゃんと反映されているか確認しましょう。

mysql> SHOW VARIABLES LIKE "char%";

下記のように表示されていればOKです。

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

もし、「character_set_database」と「character_set_server」がlatin1の場合は、設定が反映されていません。
一度、
mysql> EXIT;

で抜けて、設定ファイルにちゃんと記述できてるかや、サーバ再起動で反映してください。
それでも反映できなかった場合(またはmy.cnfが編集できない場合)は、データベースを作成する時に、データベースの文字コードを設定することでも対応できます(後述)。


■DBを作成する
下記コマンドはデータベース一覧を表示します。

mysql> SHOW DATABASES;

まずはサンプル用にDBを作ってみます。DB名は「sampledb」にしました。

mysql> CREATE DATABASE sampledb;

もし、文字コードを指定して作成する場合は以下のようにしてください。
mysql> CREATE DATABASE sampledb DEFAULT CHARACTER SET utf8;

この場合だと、文字コードはutf8で作成することになります。

データベース一覧を確認すると「sampledb」が追加されていると思います。

■ユーザを作成する
rootユーザを使い続けたり、開発中のユーザとして使うのはあまりよろしくないと思います。
なので、新規でユーザを作成します。
ユーザ名は「sampleuser」にしていますが、任意に変えて、以降は置き換えて読んでくれれば良いと思います。
また、最後のシングルクォーテーションで囲ってある箇所はパスワードの設定なので、任意の文字列に置き換えてください。

mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON sampledb.* TO sampleuser@localhost IDENTIFIED BY '(パスワード)';

ユーザ名「sampleuser」に「sampledb」のすべてのテーブルに対するDMLが扱える権限を与えています。
ユーザ名の後に「@localhost」とつけていますが、アクセスするホスト名を指定しています。
※これを付けないと実はlocalhostからもアクセスできません。僕ははまっちゃいました。
 何も指定していない状態では'%'が当てられます。これは'%.kobegdg.blogspot.jp'のようにすると、kobegdgドメインのすべてのホストが対象になる、というものなのですが、ちゃんと指定しないといけないみたいですね。

MyMySQLライブラリのテストユーザとして使いたいなら、権限はDROP、CREATEを与えるか、ALLで作成してください。
また次回MyMySQLライブラリのテストをする時に、テストユーザを作ろうと思っているので、今回はそのままでも構わないと思います。

一度、
mysql> EXIT;
で抜けて、
mysql -u sampleuser -p sampledb

でMySQLサーバに接続できればOKです。


次回後編は実際にMyMySQLを使ってみたいと思います。

0 件のコメント:

コメントを投稿