ローイングファンのプログラミング日記

ボート競技やプログラミングについて書きます

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