MySQLサーバを使ってMySQL 2 GEMを使用します


MySQL 2 GEMを使用して、RailsのMySQLサーバーと対話するサービスを作成するシリーズの第2部です.あなたは最初の部分を読むことができます.

要件
外部のMySQLサーバと接続する
  • [ X ]サービス
  • []基本的なクエリを実行します.
  • [準備]文
  • []トランザクション
  • を実行します
  • [] Joinクエリを実行する
  • 前のブログでは、我々はサービスを作成し、また、select操作を実行するメソッドを追加しました.今日、MySQLサーバーへの挿入および更新操作をmysql 2 gemを使用して実行するための追加メソッドを追加します.

    このブログで
    このブログでは次のように学びます.
  • は、挿入質問
  • を実行します
  • 更新クエリ
  • を実行する

    挿入クエリを実行する
    挿入クエリは、データベース内の新しいレコードを作成するために使用されます.

    コード
    
    def insert(attributes)
      query = format_insert_query(attributes)
    
      perform_mysql_operation do
        mysql_client.query(query)
    
        puts 'Record inserted!'
      end
    end
    
    private
    
    def format_insert_query(attributes)
      raise 'Attributes cannot be empty' if attributes.empty?
    
      columns = attributes.keys.join(',')
    
      values = attributes.values.collect! { |value| "'#{value}'" }.join(',')
    
      "INSERT INTO #{table} (#{columns}) VALUES (#{values})"
    end
    

    解説format_insert_queryattributes法からinsertハッシュパラメータを取っています.メソッドの内部で起こっています.
  • 属性のキー部分をフォーマットすることでカラム名を取得する
  • 属性の値部分を書式設定することにより、値を挿入する
  • 挿入クエリ
  • を構築して返す
    以下はinsertメソッドの中で起こっています.
  • は、挿入操作
  • のために直接使うことができる問合せを得るために、format_insert_queryを呼び出します
    に挿入する

  • 実際に
  • {first_name: 'John', last_name: 'Doe'}は24679142のパラメタとして受け取られます.そして、それはフォーマットされた質問
  • を得るためにattributesに送られますformat_insert_queryformat_insert_queryの内部の
  • は、値columnsを持ちます;"first_name,last_name"ハッシュのキー部分、attributesvaluesを持ちます"'John','Doe'"ハッシュの値部分.最後に、attributestableならば、それはusersを返します
  • 現在、"INSERT INTO users (first_name,last_name) VALUES ('John','Doe')"のメソッドは、クエリをサーバーに送信し、新しいレコードがデータベースに挿入されます.

  • 更新クエリを実行する
    更新クエリは、データベース内の既存のレコードを更新するために使用されます.

    コード
    def update(id, attributes)
      query = format_update_query(id, attributes)
    
      perform_mysql_operation do
        mysql_client.query(query)
    
        puts 'Record Updated!'
      end
    end
    
    private
    
    def format_update_query(id, attributes)
      raise 'Attributes cannot be empty' if attributes.empty?
    
      formatted_attributes = attributes.map { |key, value| "#{key}='#{value}'" }.join(',')
    
      "UPDATE #{table} SET #{formatted_attributes} WHERE #{primary_column}=#{id}"
    end
    

    解説insertへの変更はupdateまでですまた、insertをパラメータとしています.id私たちはデータベースで更新する既存のレコードを知ることができます.これは、クエリのフォーマットとデータベース内の更新を取得している概念は、クエリの変更だけでidと同じです.insertformat_update_queryのそれとわずかな違いがありますそれはformat_insert_queryを異なって変換しています、下記の実例でそれを見ましょう.
  • 我々が挿入質問と同じattributesid=1を提供しているならば、attributesformat_update_queryを返します
  • 現在、"UPDATE users SET first_name='John',last_name='Doe' WHERE id=1"のメソッドは、サーバーにクエリを送信し、データベースにupdateでレコードを更新します.

  • 最終コード
    パート1からチュートリアルに従っている場合は、次のようにします.
    require 'mysql2'
    
    module MySqlServer
      module Database
        class Connect
          attr_reader :mysql_client, :table, :primary_column
    
          def initialize(table, primary_column)
            @table = table
            @primary_column = primary_column
          end
    
          def fetch_all
            perform_mysql_operation do
              result = mysql_client.query("SELECT * from #{table}")
    
              puts result.entries
            end
          end
    
          def fetch_one(id)
            perform_mysql_operation do
              result = mysql_client.query("SELECT * from #{table} WHERE #{primary_column}=#{id}")
    
              puts result.entries
            end
          end
    
          def insert(attributes)
            query = format_insert_query(attributes)
    
            perform_mysql_operation do
              mysql_client.query(query)
    
              puts 'Record inserted!'
            end
          end
    
          def update(id, attributes)
            query = format_update_query(id, attributes)
    
            perform_mysql_operation do
              mysql_client.query(query)
    
              puts 'Record Updated!'
            end
          end
    
          private
    
          def connect_to_db
            host = ENV['MYSQL_SERVER_IP']
            database = ENV['MYSQL_DB_NAME']
            username = ENV['MYSQL_USERNAME']
            password = ENV['MYSQL_PASSWORD']
    
            Mysql2::Client.new(username: username, password: password, database: database, host: host)
          end
    
          def perform_mysql_operation
            raise ArgumentError, 'No block was given' unless block_given?
    
            begin
              @mysql_client = connect_to_db
    
              yield
            rescue StandardError => e
              raise e
            ensure
              mysql_client&.close
            end
          end
    
          def format_insert_query(attributes)
            raise 'Attributes cannot be empty' if attributes.empty?
    
            columns = attributes.keys.join(',')
    
            values = attributes.values.collect! { |value| "'#{value}'" }.join(',')
    
            "INSERT INTO #{table} (#{columns}) VALUES (#{values})"
          end
    
          def format_update_query(id, attributes)
            raise 'Attributes cannot be empty' if attributes.empty?
    
            formatted_attributes = attributes.map { |key, value| "#{key}='#{value}'" }.join(',')
    
            "UPDATE #{table} SET #{formatted_attributes} WHERE #{primary_column}=#{id}"
          end
        end
      end
    end
    
    この後、MySQL 2 GEMを使って外部のMySQLサーバで基本的なクエリを実行できます.来週、SQLインジェクション問題を回避するのに役立つプリペアドステートメントでクエリを実行する方法を学びます.
    イメージクレジット:Kelvin YangUnsplashによるカバーイメージ