RubyからPostgreSQLを操作する
前回、Bundlerを使ってPg、Active Record、dotenvという3つのgemをインストールした。
今回はこれらのgemを使ってRubyからPostgreSQLを操作する。
目次
Pgとは
PgはPostgreSQLへのRubyインターフェース。
Pgを使うとRubyからPostgreSQLへの接続や操作ができる。
Pg単独でも使えるが、今回はActive Recordと一緒に使う。Active RecordがPostgreSQLと接続するときにPgが使われる。
RubyGems Webサイト
pg
https://rubygems.org/gems/pg/versions/1.0.0-x64-mingw32
Pg Webページ
https://bitbucket.org/ged/ruby-pg/wiki/Home
Active Recordとは
Active Recordはデータベースを扱うためのgem。
Active RecordとさらにPgがインストールされているとRubyからPostgreSQLを操作できる。
Active Recordにはデータベース名、テーブル名、クラス名の命名ルールがあるのでデータベースをつくるときは注意が必要。
Active Record Webサイト
https://railsguides.jp/active_record_basics.html
dotenvとは
dotenvは.env
ファイルで設定した環境変数を読み込むgem。
パスワードなどの隠したい値をRubyコードに直接記入せず別ファイル(.env)に保存できる。
書式は次のとおり。
.env
変数名=値
読み込み方
Rubyコード
ENV['変数名']
dotenv Webページ
https://github.com/bkeepers/dotenv
RubyからPoatgreSQLを操作する
実際にコードを書いて試す。
データーベースとテーブルは以前つくったものを使う。
Active Recordには、テーブル名はデータベース名 + sとするルールがある。
testデーターベース/testsテーブル
raceno events groups rank1 crew_rank1 rank2 crew_rank2 rank3 crew_rank3 ------+---------+-------+------+-----------+------+-----------+------+------------ 1 男子エイト 予選A組 1 A大学 2 B大学 3 Cクラブ 2 男子エイト 予選B組 1 D大学 2 E大学 3 Fクラブ
.env
myadapter=postgresql myusername=username mypassword=password mydatabase=test
activerecord_test.rb
require 'active_record' require 'dotenv/load' # ---接続の書式--- #ActiveRecord::Base.establish_connection( # adapter: "postgresql", # host: "", # username: "myusername", # password: "", # database: "test" #) # ---//接続の書式--- #環境変数を使って接続する ActiveRecord::Base.establish_connection( adapter: ENV['myadapter'], host: "", username: ENV['myusername'], password: "", database: ENV['mydatabase'] ) #クラスをつくる クラス名はDB名の一文字目を大文字にする class Test < ActiveRecord::Base end #1行目のレコードを呼び出す first_tests = Test.first #全てのレコードを呼び出す all_tests = Test.all puts "レコードの書式を表示" p first_tests puts "レコードの内容をカラム別に呼び出す" all_tests.each do |alltest| puts "#{alltest['events']} #{alltest['groups']} #{alltest['rank1']}着 #{alltest['crew_rank1']}" end
コードの説明。
- Active Recordとdotenvをrequireする
- requireの仕方は各々コードのとおり
- Active Recordを使う場合、Pgはインストールするだけでrequireしなくても大丈夫
- 環境変数を使ってデーターベースと接続する
- メソッドは
ActiveRecord::Base.establish_connection
- adapter: 今回の場合はpostgresql
- host: 今回の場合は記入不要
- username:
- macOS10の場合、デフォルト設定だとOSのユーザー名
- Windows10の場合、デフォルト設定だとpostgres
- password: 設定している場合は記入する。Windows10版のデフォルト設定だと必要
- database: データーベース名を記入。今回はtest
- メソッドは
- Active Recordのclass(クラス)をつくる
- クラス名はデータベース名の一文字目を大文字にする。
- 今回の場合はTestになる
- 1行目のレコードを呼び出す
- firstメソッド
- 全てのレコードを呼び出す
- allメソッド
- pメソッドでレコードの詳細を表示
- レコードがハッシュに似たかたで呼び出されているのがわかる
- eachメソッドで1行ずつ呼び出す
- レコードの内容をカラム別に呼び出す
- 書式は
変数名['カラム名']
- putsメソッドでターミナル/PowerShellに表示
- 書式は
コードの実行
Rubyから接続するにはPostgreSQLサーバーが起動している必要があるのでコードを実行する前に起動しておく。
pathオプションをつけてbundle install
したgemを使う場合、bundle exec
をコマンドの頭につける必要がある。
今回の例だと次のようになる。
bundle exec ruby activerecord_test.rb
実行結果
Windows PowerShellの場合、pメソッド出力の際、環境によっては文字列がバイト列で表示される。
レコードの書式を表示 #<Test raceno: 1, events: "男子エイト", groups: "予選A組", rank1: 1, crew_rank1: "A大学", rank2: 2, crew_rank2: "B大学", rank3: 3, crew_rank3: "Cクラブ", rank4: nil, crew_rank4: nil, rank5: nil, crew_rank5: nil, rank6: nil, crew_rank6: nil> レコードの内容をカラム別に呼び出す 男子エイト 予選A組 1着 A大学 男子エイト 予選B組 1着 D大学
RubyからPostgreSQLを操作できた。
今回の動作確認環境
macOS 10.13.4
Ruby 2.4.4p296
ターミナル 2.8.2
Windows10 1709
Windows PowerShell 5.1.16299.251
Ruby 2.5.1p57 [x64-mingw32]
PostgreSQL 10.3