借金エンジニアのささやき

借金まみれのエンジニアが色々ささやきます。(色々:借金、ダイエット、R言語、Python、ゲーム、ミスチル)

【R言語】DB(MySQL)からデータを抽出!


スポンサードリンク

おはようございます。こんにちは。こんばんは。

今回はR言語で DB(MySQL)に接続し、データを抽出してみます。

R

R studioで DBI と MySQL のパッケージをインストール

まずは、前回の「音を鳴らす」でも行ったパッケージをインストールします。

www.shakkinengineer.com

今回インストールするのは DBIMySQL のパッケージです。
前回と同じく、R studio のConsole からインストールしましょう。

DBI
install.packages("DBI")
MySQL
install.packages("RMySQL")

こちらは、「パッケージのソースからインストールを行いますか? (コンパイルが必要です) 」と聞かれますので、y を入力して、インストールしてください。

DBを準備

今回のテスト用にAWS RDSを使用してDBを作りました。

こんなテーブルに

CREATE TABLE `t_shakkinengineer` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

こんなデータを

データ

用意しました。

DBからデータを抽出!

では本題のデータ抽出に入ります。
今回は次のような動作をするスクリプトを作成します。

  1. DBに接続
  2. t_shakkinengineerテーブルのデータを全件抽出
  3. Consoleにデータを表示
  4. (おまけ)データを表示したことを音を鳴らして通知

(音での通知、便利ですよ〜)

スクリプト全体

細かい説明は後にして、まずはスクリプト全体です。

db_select <- function(){
  
  # インストールしたパッケージの読み込み
  library("RMySQL")
  library("beepr")
  
  # DB接続設定
  conn <- dbConnect(
    drv = RMySQL::MySQL(),
    dbname = "shakkinengineer",
    host = "shakkinengineer.cmztc5ttdocl.ap-northeast-1.rds.amazonaws.com",
    username = "shakkinengineer",
    password = "shakkinengineer"
  )
  
  # 関数終了時にDB切断
  # on.exitで関数終了時の処理を指定する
  # add = TRUEは指定した処理を終了時処理に追加する
  on.exit(dbDisconnect(conn), add = TRUE)
  
  # SQL文を変数sqlに格納
  sql <- "SELECT * FROM t_shakkinengineer;"
  
  # DBに接続、SQLを実行し、結果を変数dataに格納
  data <- dbGetQuery(conn, sql)
  
  # Console に 変数dataを表示
  print(data)
  
  # 音を鳴らす!
  beep(sound = 3, expr = NULL)
  
  return()
  
}

スクリプト実行結果

次にスクリプトを実行した結果です。 スクリプト実行結果

ばっちり抽出できてますね。
ちゃんと音も鳴りました!

「NULL」はスクリプト中のreturn()で何も実行結果を返していないため表示されています。

警告も出ていますが、RMySQLのバージョンが古いと出るみたいです。

この記事に、バージョンを上げて、警告を解消する方法が書かれているので、気になる方は試してみてください。 qiita.com

スクリプトの作り方、実行方法は以前記事にしているので、こちらも参考にしてください。 www.shakkinengineer.com

スクリプトで使用している関数・コマンド

最後にスクリプトで使用している関数を見ていきます。

library()

library()はパッケージを読み込む関数です。
あれ?DBIは?と思いますよね。
RMySQLを読み込むと、DBIも読み込まれるようです。
確かめていませんが、library("DBI")は不要です。

dbConnect()

dbConnect()は見たまんま、DBに接続する関数です。
DBとの接続情報を変数connに格納しています。

on.exit()

on.exit()はスクリプト終了時に実行する処理を設定する関数です。
エラーで終了になった場合も、ここで設定した処理が実行されるので、DBとの接続を切断する処理をこの関数で設定します。
addオプションには「TRUE」「FALSE」が指定できます。
「TRUE」は処理を追加、「FALSE」は処理を書き換えます。

dbDisconnect()

dbDisconnect()も見たまんまですね。DBとの接続を切断する関数です。
引数には接続情報を設定します。
今回のスクリプトではon.exit()でスクリプト終了時に実行する処理として設定しましたので、接続後にすぐ切断しているように見えますが、最後に実行されます。

dbGetQuery()

dbGetQuery()も見たまんまでしょうか。SQL文をDBに渡し、結果をGETする関数です。
関数の説明には「Send query, retrieve results and then clear result set」となっていて、dbSendQuery()dbFetch()dbClearResult()の3つの関数が実行されているようです。
引数には接続情報とSQL文を設定します。

おわりに

いかがでしたでしょうか?
1回できれば、簡単です。

ちなみに、dbGetQuery()で抽出したデータはリスト型になっています。
リスト型データの扱いについても、後日記事にしたいと思っています。

以上です。