学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

Ruby on RailsでWebアプリケーション開発その16 MySQLの接続と作成

<<前  [TOP]  次>>


MySQLデータベースを使用して「shop」アプリケーションを作り直します。
「work」フォルダにある今まで作成してきた「shop」フォルダは別の場所に移動して「work」フォルダが何もない状態にしておいて下さい。


ではコマンドプロンプトで「work」フォルダに移動して「rails new shop --database=mysql」と入力します。
f:id:MrRadiology:20180205172045p:plain


最後をメッセージを見ると、「MySQL Connector/C version 6.1.11」が必要だとかいてあります。
f:id:MrRadiology:20180205172258p:plain


ここに書いてある「http://cdn.mysql.com/Downloads/Connector-C/mysql-connector-c-6.1.11-win32.zip」にアクセスして「mysql-connector-c-6.1.11-win32.zip」ファイルをダウンロードします。
ダウンロードされたzipファイルを展開して、「lib」フォルダにある「libmysql.dll」ファイルをコピーします。
f:id:MrRadiology:20180205172823j:plain


コピーした「libmysql.dll」ファイルをRubyをインストールしたフォルダ「C:\Ruby24-x64」の「bin」フォルダに貼り付けます。
f:id:MrRadiology:20180205173219j:plain


作成されている「shop」フォルダを「work」フォルダから削除し、もう一度「rails new shop --database=mysql」と入力します。
今度はうまくいきました。
f:id:MrRadiology:20180205173422p:plain


次にWebアプリケーション用のデータベースを作成します。
作成するデータベースは3つ必要となります。
一つめは「開発用データベース」、二つめは「テスト用データベース」、三つ目は「本番用データベース」です。

  • 開発用データベース: shop_development
  • テスト用データベース: shop_test
  • 本番用データベース: shop_production


    このように「アプリケーション名_development」「アプリケーション名_test」「アプリケーション名_production」がデフォルトの名前になります。


    まず、コマンドプロンプトでshopフォルダに入って、「mysql -u root -p」と入力します。
    そうすると、MySQLのインストール時に入力したルート(root)パスワードを聞いてきますので入力して下さい。
    これでMySQLにログイン出来ます。
    f:id:MrRadiology:20180206111511p:plain


    上記3つのデータベースを作成します。
    データベースの作成には「create database」を使用します。
    例えば、「create database shop_development;」とすると、「shop_development」データベースがMySQLに作成されます。
    最後のセミコロン(;)を忘れないようにして下さい。
    また、同時に「default character set utf8」として、日本語文字コードの指定を行います。
    このようにデータベース作成時に文字コードを指定しないと、文字化けが起こります。
    以下のコマンドでデータベースを3つ作成します。
    create database shop_development default character set utf8;
    create database shop_test default character set utf8;
    create database shop_production default character set utf8;
    f:id:MrRadiology:20180206115008p:plain


    次に、作成したデータベースにユーザ権限を与えます。
    権限を与えるには「grant all」を使用します。
    例えば、「grant all on shop_mysql_development.* to 'rails'@'localhost';」としたら、ユーザ名がrails、ホストがlocalhostでアクセスしてきたものにすべての権限を与えるという意味になります。
    ここで、localhostの部分を「%」にすると、別のネットワークPCからのデータベースアクセスが可能になります。
    今回は、1台のPCのみで開発することを想定して、「localhost」とします。


    まずはユーザを作成します。
    ユーザの作成には「create user」コマンドを使います。
    create user rails@'localhost' identified by '';>」
    f:id:MrRadiology:20180206114005p:plain


    また、「grant all on shop_mysql_production.* to 'rails'@'localhost' identified by 'administrator';」とすると、ユーザ名がrails、ホストがlocalhost、パスワードがadministratorでアクセスしてきたものにすべての権限を与えるという意味になります。
    では、パスワードをつけて権限を与えてみます。空パスワードだと「rake db:migrate」する際にエラーが出て接続できません。


    以下の3つのコマンドを実行します。
    grant all on shop_development.* to 'rails'@'localhost' identified by 'rails';
    grant all on shop_test.* to 'rails'@'localhost' identified by 'rails';
    grant all on shop_production.* to 'rails'@'localhost' identified by 'rails';
    f:id:MrRadiology:20180207113117p:plain


    「exit;」と入力してMySQLを抜けます。
    f:id:MrRadiology:20180207113133p:plain


    Railsとデータベースを接続するためには、先ほどデータベースの権限を設定した情報をRailsに知らせる必要があります。
    データベースの接続情報は「shop」フォルダの「config」フォルダにある、「database.yml」に記述します。


    デフォルトの「database.yml」ファイルは以下のようになっています(コメント以外を抜粋)。
    【shop/config/database.yml】

    default: &default
      adapter: mysql2
      encoding: utf8
      pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
      username: root
      password:
      host: localhost
    
    development:
      <<: *default
      database: shop_development
    
    test:
      <<: *default
      database: shop_test
    
    production:
      <<: *default
      database: shop_production
      username: shop
      password: <%= ENV['SHOP_DATABASE_PASSWORD'] %>



    大きく、開発、テスト、本番の3つに分かれています。
    それぞれの項目について説明します。

  • adapter: 使用しているデータベースドライバ名。今回はmysql2。
  • encoding: 使用する文字コード。今回は「utf8」
  • pool: 同時接続数(デフォルトは5)
  • database: 使用するデータベース名。
  • username: 接続するユーザ名。
  • password: 接続するために必要なパスワード。
  • host: データベースのホスト。


    これを以下のように書き換えます。

    default: &default
      adapter: mysql2
      encoding: utf8
      pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
      username: rails
      password: rails
      host: localhost
    
    development:
      <<: *default
      database: shop_development
    
    test:
      <<: *default
      database: shop_test
    
    production:
      <<: *default
      database: shop_production
      username: rails
      password: rails

    「default」の「username」を「rails」、「 password」も「rails」です。
    「production」も同じです。


    まずは、商品を格納するテーブルを作成します。
    テーブルの名前は必ず複数形にするのがルールです。
    この後、実際にRubyでコードを書いていくモデルクラスというものが登場しますが、そのモデルクラスの名前は単数形で最初の文字は大文字というルールがあります。
    このようにルール通り名前をつけておくと、モデルクラスでわざわざテーブル名を指定しなくてもRailsが自動的にテーブルを探し出すことが出来ます。


    では、商品のテーブルを作成してみましょう。
    「goods」という単語を使い、モデル名は「good」です。


    作成するフィールドの内容は次のようにします。
    SQLiteの時とはデータ型が違います。

  • goods_id: 商品のID用。integer型
  • title: 商品の名前。string型
  • description: 商品の説明用。text型
  • image_url: 商品の画像URL用。string 型
  • price: 商品の価格。decimal型
  • date: 商品の登録日。datetime型
  • maker: 商品の製造業者。string型
  • category: 商品のカテゴリー分類用。string型


    Railsでは「scaffold」を使ってテーブルを生成していきます。

    rails generate scaffold モデル名(単数形) フィールド名1:データ型 フィールド名2:データ型
    



    ではコマンドプロンプトで「shop」フォルダに移動し、「rails generate scaffold good goods_id:integer title:string description:text image_url:string price:decimal date:datetime maker:string category:string」と入力します。
    これでアプリケーションに必要なモデルやビューなどが作成されました。
    f:id:MrRadiology:20180207123951p:plain


    では「db」フォルダの「migrate」フォルダにある「create_goods.rb」ファイルを見てみます。
    【db/migrate/create_goods.rb】

    class CreateGoods < ActiveRecord::Migration
      def change
        create_table :goods do |t|
          t.integer :goods_id
          t.string :title
          t.text :description
          t.string :image_url
          t.decimal :price
          t.datetime :date
          t.string :maker
          t.string :category
    
          t.timestamps
        end
      end
    end
    



    priceフィールドの型「decimal」を10桁、小数点第2位の数字に定義したいので、「create_goods.rb」ファイルを以下のように修正します。
    【db/migrate/create_goods.rb】

    class CreateGoods < ActiveRecord::Migration
      def change
        create_table :goods do |t|
          t.integer :goods_id
          t.string :title
          t.text :description
          t.string :image_url
          t.decimal :price, :precision => 10, :scale => 2, :default =>0
          t.datetime :date
          t.string :maker
          t.string :category
    
          t.timestamps
        end
      end
    end
    



    以下の部分が違います。

     t.decimal :price, :precision => 10, :scale => 2, :default =>0
    

    「decimal」を10桁、小数点第2位の数字でかつ、デフォルトの値を「0」で定義しています。


    では、実際にこのファイルをデータベースに適用してみます。
    コマンドプロンプトで「rake db:migrate」と入力してください。
    f:id:MrRadiology:20180207113734p:plain


    実際にテーブルが出来ているかどうか見てみます。
    コマンドプロンプトでMySQLに接続して、「use shop_development;」と入力すると「shop_development」データベースに接続できます。
    その後「show tables;」と入力してテーブル一覧を見てみます。
    f:id:MrRadiology:20180207113934p:plain
    「goods」テーブルが出来ているのがわかります。


    次に「describe goods;」と入力してテーブルの中身を見てみます。
    f:id:MrRadiology:20180221085816p:plain


    編集したとおりのテーブルがデータベースに出来上がりました。
    Rails5.1では自動生成される「id」フィールドが「bigint」型でしたが、Rails4.2では「int」型になっています。


    <<前  [TOP]  次>>