Como usar o Cloud SQL com Ruby

Nesta parte do tutorial do Bookshelf, confira como os dados permanentes do aplicativo de amostra são armazenados no Cloud SQL.

Esta página faz parte de um tutorial com várias páginas. Para começar do início e ver as instruções de configuração, consulte Aplicativo Bookshelf em Ruby.

Como criar uma instância do Cloud SQL

Quando implantado, o aplicativo usa o Cloud SQL Proxy incorporado ao ambiente do App Engine para se comunicar com sua instância do Cloud SQL. No entanto, para testar o aplicativo no local, é necessário instalar e usar uma cópia local do proxy no ambiente de desenvolvimento.

Saiba mais sobre o Cloud SQL Proxy.

Para executar tarefas administrativas básicas na instância do Cloud SQL, use o cliente MySQL.

Como instalar o Cloud SQL Proxy

Faça o download do Cloud SQL Proxy e instale-o. Ele se conectará à sua instância do Cloud SQL durante a execução local.

Linux de 64 bits

  1. Faça o download do proxy:
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
    
  2. Torne o proxy executável:
    chmod +x cloud_sql_proxy
    

Linux de 32 bits

  1. Faça o download do proxy:
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
    
  2. Torne o proxy executável:
    chmod +x cloud_sql_proxy
    

macOS de 64 bits

  1. Faça o download do proxy:
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
    
  2. Torne o proxy executável:
    chmod +x cloud_sql_proxy
    

macOS de 32 bits

  1. Faça o download do proxy:
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
    
  2. Torne o proxy executável:
    chmod +x cloud_sql_proxy
    

Windows de 64 bits

Clique com o botão direito do mouse em https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe e selecione Salvar link como para fazer o download do proxy. Renomeie o arquivo como cloud_sql_proxy.exe.

Windows de 32 bits

Clique com o botão direito do mouse em https://dl.google.com/cloudsql/cloud_sql_proxy_x86.exe e selecione Salvar link como para fazer o download do proxy. Renomeie o arquivo como cloud_sql_proxy.exe.
Se o seu sistema operacional não estiver incluído aqui, compile o proxy a partir da fonte (em inglês).

Como criar uma instância do Cloud SQL

  1. Crie uma instância de segunda geração do Cloud SQL para MySQL.

    Atribua o nome [YOUR_INSTANCE_NAME] ou outro similar à instância. Pode levar alguns minutos para a instância ficar pronta. Quando isso acontecer, ela estará visível na lista de instâncias.

  2. Agora, use o SDK do Cloud para executar o seguinte comando, em que [YOUR_INSTANCE_NAME] representa o nome da sua instância do Cloud SQL.
    gcloud sql instances describe [YOUR_INSTANCE_NAME]

    No resultado, observe o valor exibido em [CONNECTION_NAME].

    O valor de [CONNECTION_NAME] está no formato [PROJECT_NAME]:[REGION_NAME]:[INSTANCE_NAME].

Como inicializar a instância do Cloud SQL

  1. Antes de usar ./cloud_sql_proxy pela primeira vez, crie um diretório para os sockets com proxy:

    sudo mkdir /cloudsql
    sudo chmod 0777 /cloudsql
    
  2. Inicie o Cloud SQL Proxy usando o [CONNECTION_NAME] da etapa anterior.

    ./cloud_sql_proxy -instances="[YOUR_INSTANCE_CONNECTION_NAME]" -dir=/cloudsql
    

    Substitua [YOUR_INSTANCE_CONNECTION_NAME] pelo nome de conexão da instância do Cloud SQL. Nessa etapa, é estabelecida uma conexão do computador local com a instância do Cloud SQL para testes locais. Mantenha o Cloud SQL Proxy em execução durante todo o teste local do aplicativo.

  3. Crie um novo usuário do Cloud SQL com um banco de dados associado.

    Console do GCP

    1. Crie um novo banco de dados por meio do Console do GCP para a instância [YOUR_INSTANCE_NAME] do Cloud SQL. Por exemplo, use o nome [MYSQL_DATABASE].
    2. Crie um novo usuário por meio do Console do GCP para a instância [YOUR_INSTANCE_NAME] do Cloud SQL.

    Cliente MySQL

    1. Em uma guia separada de linha de comando, use o cliente MySQL ou um programa semelhante para se conectar à instância. Quando solicitado, use a senha raiz configurada.
      mysql --socket "/cloudsql/[YOUR_INSTANCE_CONNECTION_NAME]" --user root --password
    2. Crie os bancos de dados, usuários e permissões de acesso exigidos no banco de dados do Cloud SQL por meio dos comandos a seguir. Substitua [MYSQL_USER] e [MYSQL_PASSWORD] pelo nome de usuário e senha que você quer usar.
      CREATE DATABASE [MYSQL_DATABASE];
      CREATE USER '[MYSQL_USER]' IDENTIFIED BY '[MYSQL_PASSWORD]';
      GRANT ALL ON . TO '[MYSQL_USER]';

Como definir configurações

  1. Acesse o diretório getting-started-ruby/2-cloud-sql e copie o arquivo database.example.yml.

     cp config/database.example.yml config/database.yml
    
  2. Para configurar o banco de dados, edite o arquivo config/database.yml.

    mysql_settings: &mysql_settings
      adapter: mysql2
      encoding: utf8
      pool: 5
      username: [MYSQL_USER]
      password: [MYSQL_PASS]
      database: [MYSQL_DATABASE]
      socket: /cloudsql/[YOUR_INSTANCE_CONNECTION_NAME]
    • Substitua [MYSQL_USER] e [MYSQL_PASS] pelo nome de usuário e pela senha da instância do Cloud SQL criados anteriormente.

    • Substitua [MYSQL_DATABASE] pelo nome do banco de dados criado anteriormente.

    • Substitua [YOUR_INSTANCE_CONNECTION_NAME] pelo Instance Connection Name da instância do Cloud SQL.

  3. Para preparar o App Engine com o Cloud SQL, edite app.yaml.

    beta_settings:
      # The connection name of your instance on its Overview page in the Google
      # Cloud Platform Console, or use `[YOUR_PROJECT_ID]:[YOUR_REGION]:[YOUR_INSTANCE_NAME]`
      cloud_sql_instances: [YOUR_INSTANCE_CONNECTION_NAME]

Como instalar dependências

No diretório 2-cloud-sql, insira o seguinte comando:

bundle install

Como criar um banco de dados e tabelas

  1. Crie o banco de dados e execute migrações para criar a tabela necessária.

    bundle exec rake db:migrate
    

    Uma mensagem indicando que a migração de CreateBooks foi bem-sucedida é exibida:

    == 20150706182833 CreateBooks: migrating ===============================
    -- create_table(:books)
    -> 0.4526s
    == 20150706182833 CreateBooks: migrated (0.4528s) ======================
    

    A migração de CreateBooks cria uma nova tabela books com colunas para armazenar o título, o autor, a data de publicação e a descrição do livro:

    class CreateBooks < ActiveRecord::Migration
      def change
        create_table :books do |t|
          t.string :title, required: true
          t.string :author
          t.date :published_on
          t.text :description
          t.timestamps null: false
        end
      end
    end
    

Como executar o app na máquina local

  1. Inicie um servidor da Web local.

    bundle exec rails server
    
  2. No navegador da Web, digite este endereço:

    http://localhost:3000

Agora, navegue nas páginas da Web do aplicativo para adicionar, editar e excluir livros.

Para sair do servidor da Web local, pressione Control+C.

Como implantar o app no ambiente flexível do App Engine

  1. Compile os recursos do JavaScript para produção.

    RAILS_ENV=production bundle exec rake assets:precompile
    
  2. Implante o app de amostra.

    gcloud app deploy
    
  3. No navegador da Web, digite o endereço a seguir.

    https://[YOUR_PROJECT_ID].appspot.com
    

Atualize o app e implante a versão atualizada com o mesmo comando usado para implantá-lo pela primeira vez. A implantação cria uma nova versão do app e a define como padrão. As versões mais antigas são mantidas, bem como as instâncias de VM associadas. Lembre-se de que essas versões do aplicativo e instâncias de VM são recursos passíveis de cobrança.

Reduza os custos excluindo as versões não padrão do app.

Para excluir uma versão do app:

  1. No Console do GCP, acesse a página "Versões do App Engine".

    Acessar a página Versões

  2. Clique na caixa de seleção ao lado da versão do aplicativo não padrão que você quer excluir.
  3. Clique no botão Excluir na parte superior da página para excluir a versão do aplicativo.

Para informações detalhadas sobre a remoção de recursos faturáveis, consulte a seção Como fazer a limpeza na etapa final deste tutorial.

Estrutura do app

Este diagrama mostra os componentes do app e como se encaixam.

Processo de implantação e estrutura do app Bookshelf

Noções básicas sobre o código

Esta seção analisa o código do aplicativo e explica como ele funciona.

Listar livros

Ao visitar a página inicial do aplicativo, você é direcionado para a ação index da classe BooksController. Isso é configurado no arquivo config/routes.rb.

Rails.application.routes.draw do

  # Route root of application to BooksController#index action
  root "books#index"

  # Restful routes for BooksController
  resources :books

end

A ação BookController#index recupera uma lista de livros do banco de dados do Cloud SQL. O aplicativo lista no máximo 10 livros em cada página da Web. Então, a lista depende da página que o usuário está visualizando. Por exemplo, suponha que há 26 livros no banco de dados e o usuário está na terceira página (/?page=3). Nesse caso, params[:page] é igual a 3, que é atribuído à variável page_number. Isso resulta em uma lista de seis livros, começando no deslocamento 20, recuperada e atribuída a @books.

class BooksController < ApplicationController

  PER_PAGE = 10

  def index
    page_number = params[:page] ? params[:page].to_i : 1
    book_offset = PER_PAGE * (page_number - 1)
    @books      = Book.limit(PER_PAGE).offset(book_offset)
    @next_page  = page_number + 1 if @books.count == PER_PAGE
  end

A classe Book é um modelo simples de Active Record (em inglês) que representa um livro específico na tabela de livros.

class Book < ActiveRecord::Base
  validates :title, presence: true
end

No arquivo routes.rb, a chamada de resources :books configura rotas com recursos RESTful para criação, leitura, atualização e exclusão de livros que são direcionadas para as ações correspondentes na classe BooksController.

Depois que BooksController.index recupera uma lista de livros, o código do Ruby incorporado no arquivo books/index.html.erb renderiza a lista.

<% @books.each do |book| %>
  <div class="media">
    <%= link_to book_path(book) do %>
      <div class="media-body">
        <h4><%= book.title %></h4>
        <p><%= book.author %></p>
      </div>
    <% end %>
  </div>
<% end %>

<% if @next_page %>
  <nav>
    <ul class="pager">
      <li><%= link_to "More", books_path(page: @next_page) %></li>
    </ul>
  </nav>
<% end %>

Exibir detalhes do livro

Quando você clica em um livro individual na página da Web, a ação BookController#show o recupera da tabela, com a respectiva especificação de código:

def show
  @book = Book.find params[:id]
end

Em seguida, o código do Ruby incorporado no arquivo show.html.erb mostra os detalhes do livro.

<div class="media">
  <div class="media-body">
    <h4><%= @book.title %> | &nbsp; <small><%= @book.published_on %></small></h4>
    <h5>By <%= @book.author || "unknown" %></h5>
    <p><%= @book.description %></p>
  </div>
</div>

Criar livros

Ao clicar em Add book na página da Web, a ação BooksController#new cria um novo livro. O código do Ruby incorporado no arquivo new.html.erb aponta para _form.html.erb, que exibe o formulário para inclusão de um novo livro.

<%= form_for @book do |f| %>
  <div class="form-group">
    <%= f.label :title %>
    <%= f.text_field :title %>
  </div>
  <div class="form-group">
    <%= f.label :author %>
    <%= f.text_field :author %>
  </div>
  <div class="form-group">
    <%= f.label :published_on, "Date Published" %>
    <%= f.date_field :published_on %>
  </div>
  <div class="form-group">
    <%= f.label :description %>
    <%= f.text_area :description %>
  </div>
  <button class="btn btn-success" type="submit">Save</button>
<% end %>

Quando você envia o formulário, a ação BooksController#create salva o livro no banco de dados. Se o novo livro for salvo com êxito, a página dele será exibida. Caso contrário, o formulário será exibido novamente com mensagens de erro. O método book_params usa parâmetros fortes (em inglês) para especificar quais campos do formulário são permitidos. Neste caso, somente o título, o autor, a data de publicação e a descrição do livro são permitidos.

def create
  @book = Book.new book_params

  if @book.save
    flash[:success] = "Added Book"
    redirect_to book_path(@book)
  else
    render :new
  end
end

private

def book_params
  params.require(:book).permit(:title, :author, :published_on, :description)
end

Editar livros

Ao clicar em Edit book na página da Web, a ação BooksController#update recupera o livro no banco de dados. O código do Ruby incorporado no arquivo edit.html.erb aponta para _form.html.erb, que exibe o formulário para editar o livro.

def update
  @book = Book.find params[:id]

  if @book.update book_params
    flash[:success] = "Updated Book"
    redirect_to book_path(@book)
  else
    render :edit
  end
end

Quando você envia o fomulário, a ação BooksController#update salva o livro no banco de dados. Se o novo livro for salvo com êxito, a página dele será exibida. Caso contrário, o formulário será exibido com mensagens de erro.

Excluir livros

Ao clicar em Delete Book na página da Web, a ação BooksController#destroy exclui o livro do banco de dados e exibe a lista dos restantes.

def destroy
  @book = Book.find params[:id]
  @book.destroy
  redirect_to books_path
end
Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…