LoginSignup
7
11

More than 5 years have passed since last update.

JuliaでMySQLに接続する

Posted at

手元の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の練習とかでも使ってみようと思います。


本日は以上となります。

7
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
11