手元の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 run-mysql.sh
とします。
sudo apt-get install libmysqlclient-dev
をして、MySQLのクライアントをインストールします。
Juliaのコンソールに入り、
Pkg.clone("https://github.com/JuliaComputing/MySQL.jl")
using MySQL
とします。
利用してみる
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
データベースに接続する
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さへつないでいれば、だいぶインタラクティブに操作できちゃいますね。。
データ登録してみる
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の練習とかでも使ってみようと思います。
本日は以上となります。