JuliaでMySQLに接続する

手元のUbuntu環境でJuliaをちょこちょこと触っていますが、データ格納領域をどこにしようかな、ということで、MySQLをまずは試してみたので備忘を残します。

```run-mysql.sh
#!/bin/bash

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=test -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
```

こんなファイルを用意して、

```bash
bash run-mysql.sh
```

とします。

```bash
sudo apt-get install libmysqlclient-dev
```

をして、MySQLのクライアントをインストールします。

Juliaのコンソールに入り、

```
Pkg.clone("https://github.com/JuliaComputing/MySQL.jl")

using MySQL
```

とします。

# 利用してみる

```jl
julia> con = mysql_connect("127.0.0.1", "root", "test", "")
MySQL Handle
------------
Host: 127.0.0.1
User: root
DB:   


julia> command = "select user, host from mysql.user;"
"select user, host from mysql.user;"

julia> mysql_execute(con, command)
2x2 DataFrames.DataFrame
│ Row │ user   │ host        │
┝━━━━━┿━━━━━━━━┿━━━━━━━━━━━━━┥
│ 1   │ "root" │ "%"         │
│ 2   │ "root" │ "localhost" │

```

rootにデータベース指定しなくても接続できちゃいますね。

MySQL.jlのconfig.jlをみてみると、Linuxの場合に、libmysql.soを利用しておりそれより上のレイヤで制御のようなものはとくに入れてないようです。

```config.jl
  1 # This snippet is  taken from https://github.com/Dynactionize/MariaDB.jl
  2 # This the configuration  file for finding the shared  object (dll) file
  3 # for MySQL/MariaDB API.  Make sure to add the location  of the files to
  4 # path for this to work.             
  5 #                                    
  6 # TODO: Need to update lib_choices for Mac OS X and Windows.
  7                                      
  8 using Compat                         
  9                                      
 10 let                                  
 11     global mysql_lib                 
 12     succeeded = false                
 13     if !isdefined(:mysql_lib)        
 14         @linux_only lib_choices = ["libmysql.so", "libmysqlclient.so",
 15                                    "libmysqlclient_r.so", "libmariadb.so",                                                                                                                              
 16                                    "libmysqlclient_r.so.16"]
 17         @osx_only lib_choices = ["libmysqlclient.dylib"]
 18         @windows_only lib_choices = ["libmysql.dll", "libmariadb.dll"]
 19         local lib                    
 20         for lib in lib_choices       
 21             try                      
 22                 Libdl.dlopen(lib)    
 23                 succeeded = true     
 24                 break                
 25             end                      
 26         end                          
 27         succeeded || error("MYSQL library not found")
 28         @eval const mysql_lib = $lib 
 29     end                              
 30 end   
```

## データベースに接続する

```jl
julia> command = "use triplew"
"use triplew"

julia> mysql_execute(con, command)
0

julia> command = """CREATE TABLE Employee
                    (
                        ID INT NOT NULL AUTO_INCREMENT,
                        Name VARCHAR(255),
                        Salary FLOAT,
                        JoinDate DATE,
                        PRIMARY KEY (ID)
                    );"""
"CREATE TABLE Employee\n(\n    ID INT NOT NULL AUTO_INCREMENT,\n    Name VARCHAR(255),\n    Salary FLOAT,\n    JoinDate DATE,\n    PRIMARY KEY (ID)\n);"

julia> mysql_execute(con, command)
0

julia> command = "describe Employee"
"describe Employee"

julia> mysql_execute(con, command)
4x6 DataFrames.DataFrame
│ Row │ Field      │ Type           │ Null  │ Key   │ Default │ Extra            │
┝━━━━━┿━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━┿━━━━━━━┿━━━━━━━┿━━━━━━━━━┿━━━━━━━━━━━━━━━━━━┥
│ 1   │ "ID"       │ "int(11)"      │ "NO"  │ "PRI" │ NA      │ "auto_increment" │
│ 2   │ "Name"     │ "varchar(255)" │ "YES" │ NA    │ NA      │ NA               │
│ 3   │ "Salary"   │ "float"        │ "YES" │ NA    │ NA      │ NA               │
│ 4   │ "JoinDate" │ "date"         │ "YES" │ NA    │ NA      │ NA               │
```

connectionさへつないでいれば、だいぶインタラクティブに操作できちゃいますね。。

## データ登録してみる

```jl
julia> mysql_execute(con, "INSERT INTO Employee (Name, Salary) values ('John', 25000.00), ('Sam', 35000.00), ('Tom', 50000.00);")
3

julia> command = "SELECT * FROM Employee;"
"SELECT * FROM Employee;"

julia> dframe = mysql_execute(con, command)
3x4 DataFrames.DataFrame
│ Row │ ID │ Name   │ Salary  │ JoinDate │
┝━━━━━┿━━━━┿━━━━━━━━┿━━━━━━━━━┿━━━━━━━━━━┥
│ 1   │ 4  │ "John" │ 25000.0 │ NA       │
│ 2   │ 5  │ "Sam"  │ 35000.0 │ NA       │
│ 3   │ 6  │ "Tom"  │ 50000.0 │ NA       │
```

DataFramesを利用できるようです。
これは便利ですね。。kaggleの練習とかでも使ってみようと思います。

---

本日は以上となります。