PostgreSQL 練習 (準備1)

前回、PostgreSQL について調べてみました。
そして、Docker を使って PostgreSQL サーバを構築し、
psqlコマンドで操作できるようになりました。

utouto97.hatenablog.com

今回からは、この PostgreSQL を使って、Qiita で見つけた SQL の練習問題に取り組んでいきたいと思います。

SQL 練習問題

Qiita で見つけた SQL の練習問題というのは ↓ になります。

qiita.com

この記事の中では

DB Fiddleを使うとブラウザ上で簡単にSQLを実行できます。

のように書かれていますが、今回は自分で建てた PostgreSQL サーバーを使って取り組みたいと思います。

前回の記事で建てた PostgreSQL の Docker コンテナで進めていきます。

データベース作成

まずは、この練習問題用のデータベースを作成します。

PostgreSQL では、createdbコマンドを利用して、データベースを作成することができます。
Docker を使っているので docker execでコマンドを実行していきます。
今回、データベースの名前はqiita_sql_questionsとしました。

docker exec postgres createdb qiita_sql_questions -U postgres

これで、データベースが作成できました。
確認してみます。
PostgreSQL では、\lでデータベース一覧を表示することができます。
一覧の中に先ほど作成したqiita_sql_questionsがあると思います。

テーブル・データの準備

練習問題の記事の Schema SQL を参考に、データベースにテーブルを作成し、データを挿入していきます。

CREATE TABLE students (
  id integer NOT NULL PRIMARY KEY,
  name varchar(255) NOT NULL,
  gender varchar(1) NOT NULL
);


INSERT INTO students
VALUES
  (1, '長岡 一馬', ''),
  (2, '中本 知佳', ''),
  (3, '松本 義文', ''),
  (4, '佐竹 友香', '');

CREATE TABLE exam_results (
  student_id integer NOT NULL,
  subject varchar(255) NOT NULL,
  score bigint NOT NULL,
  PRIMARY KEY(student_id, subject)
);

INSERT INTO exam_results
VALUES
  (1, '国語', 30),
  (1, '英語', 30),
  (2, '国語', 70),
  (2, '数学', 80),
  (3, '理科', 92),
  (4, '社会', 90),
  (4, '理科', 35),
  (4, '英語', 22);

これで、テーブルが二つ (students と exam_results)が作成されました。
確認してみます。PostgreSQL では、\dでテーブル一覧を取得することができます。
結果は以下のようになると思います。

            List of relations
 Schema |     Name     | Type  |  Owner   
--------+--------------+-------+----------
 public | exam_results | table | postgres
 public | students     | table | postgres
(2 rows)

また、それぞれのテーブルにはデータを挿入したので、それも確認してみます。

まず、students テーブルから確認します。

SELECT * FROM students;

結果はこんな感じです。

 id |   name    | gender 
----+-----------+--------
  1 | 長岡 一馬 | 男
  2 | 中本 知佳 | 女
  3 | 松本 義文 | 男
  4 | 佐竹 友香 | 女
(4 rows)

続いて、exam_results テーブル。

SELECT * FROM exam_results;
 student_id | subject | score 
------------+---------+-------
          1 | 国語    |    30
          1 | 英語    |    30
          2 | 国語    |    70
          2 | 数学    |    80
          3 | 理科    |    92
          4 | 社会    |    90
          4 | 理科    |    35
          4 | 英語    |    22
(8 rows)

これで準備が整ったので、次回から問題を解いていきます。

utouto97.hatenablog.com

参考

qiita.com

終わり

PostgreSQL 入門

リレーショナル型のデータベースの一つであるPostgreSQL

今まで触ったことないので、今回すこし調べてみました。

PostgreSQL とは

PostgreSQL はフリーでオープンソースな、オブジェクトリレーショナルデータベース管理システム (ORDBMS) です。
また、PostgreSQL はカリフォルニア大学バークレイ校で作成された POSTGRES パッケージの派生です。

データベース管理システム (DBMS) とは、データベースの運用、管理のためのシステムやソフトウェアのことです。
そして、オブジェクトリレーショナルデータベース管理システム (ORDBMS) とは、リレーショナルデータベース管理システムの一種で、
データ型とメソッド(オブジェクト指向でいうオブジェクトのクラス)を自由に定義し、開発に利用できるデータベース管理システムのことです。

PostgreSQLの特徴としては、

  • リレーショナル型のデータベース管理システム
  • フリー・オープンソースであること

    さらに自由主義的ライセンス条件により、PostgreSQLは誰にでも、その使用、変更 、配布を個人使用、商用、学術など目的に限らず無償で可能です。

  • 日本語も対応している

などが、あります。
このほかにもたくさんあります。

Docker で PostgreSQL を試す

実際に PostgreSQL を試してみます。
今回は PostgreSQL を直接インストールするのではなく、Docker を使ってやっていきます。
Dockerhub には PostgreSQL のイメージも公開されているので、これをそのまま利用します。

hub.docker.com

まずは、Docker コンテナを起動します。

docker run --rm -d -e POSTGRES_HOST_AUTH_METHOD=trust --name postgres postgres:alpine

パスワードなしで利用できるように、環境変数 POSTGRES_HOST_AUTH_METHOD=trust を設定しています。

続いて、コンテナ内で psql コマンドを実行します。
これは PostgreSQL に接続し、コマンドで操作をすることができます。
ユーザーは postgres とします。

docker exec -it postgres psql -U postgres

これで、postgres を起動して、操作できるようになりました。

今後、実際に SQL を実行して、データベース操作を試していきたいと思います。

終わり

MVC

railsMVC です。
ところで MVC ってなんだったかな、ということで MVC について簡単にまとめていきます。

MVC とは

MVC とはアーキテクチャの一種です。
つまり、設計するときの考え方のようなものです。
特に、UIをもつ場合に使われます。 (View が UI なので)

そして、Model View Controller のそれぞれの頭文字をとって MVC です。

ちなみに、はてなブログだと 「MVC」 に下線が引かれ、クリックすれば MVC の意味が出てきます。

Model View Control。オブジェクト指向プログラミング言語の元祖のひとつ「Smalltalk」にも使用されていたアプリケーション・アーキテクチャ。アプリケーションをModel(ロジック)、View(プレゼンテーション)、Controller(通信、制御)の3つの部分に分割して、それぞれを独立して開発していくというもの。

Model View Controller

MVC の M は Model です。
Modelはデータの処理を担当します。
Web の場合だと、データベースとのやりとり (SQLクエリ) を行います。

MVC の V は View です。 View は UI を担当します。
Web の場合だと、レスポンスとして HTML, CSS, JS ファイルを返したりします。

MVC の C は Controller です。 Controller はユーザの入力の処理を担当します。
Web の場合だと、HTTPリクエストの処理を行います。
また、Model や View の制御も Controller が行います。

MVC での Web ページ表示までの流れ

f:id:utouto97:20210606205824p:plain

  1. ユーザーからのリクエス
  2. Controller がリクエストを処理
  3. 場合に応じて、Model に処理要求
  4. Model は DB にアクセスし、Controller へデータを返す
  5. Controller は View にデータを渡して、出力を指示する
  6. View はユーザーに HTML 等のファイルを出力

MVC のメリット

MVC のメリットは Model View Controller に分離できるということです。

分離することによって、

  • 分業できる
  • それぞれの依存性を減らすことができる
  • 共通しているものや似ているものを再利用しやすくなる
  • 保守性が高まる

といった、メリットがあります。

終わり

Rails APIモード

Railsを使った開発をしたいと思っています。
一方でフロントエンドに React や Vue を使いたいという気持ちもあります。
ということで、Rails でバックエンドの API サーバーを構築し、
フロントエンドは React や Vue を使っていきたいと思います。

そこで見つけたのが、RailsAPI モードです。

API とは

APIとは、「 Application Programming Interface 」のアクロニムです。
外部とやり取りをする窓口にあたるもので、
機能の一部を外部に提供するのに使われます。

例えば、Twitter API ではツイートを取得することができます。
ドキュメントホーム | Docs | Twitter Developer
ぐるなびAPIでは飲食店情報を取得することができます。
ぐるなび Web Service - トップページ

RailsAPI モード

Rails には API モードというのがあります。

Rails は基本的には MVC アーキテクチャなので、
M (モデル)、V (ビュー)、 C (コントローラ) を持ちます。

ただし、API サーバーならフロントエンドである V (ビュー) は不要です。
そのため、API モードには V (ビュー) がありません。

また、ビュー関連のGemもインストールされません。

通常モードで rails new した場合の Gemfile と
API モードで rails new した場合の Gemfile の
diff は以下の通りです。

12,17d11
< # Use SCSS for stylesheets
< gem 'sass-rails', '>= 6'
< # Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
< gem 'webpacker', '~> 5.0'
< # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
< gem 'turbolinks', '~> 5'
19c13
< gem 'jbuilder', '~> 2.7'
---
> # gem 'jbuilder', '~> 2.7'
30a25,27
> # Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible
> # gem 'rack-cors'
> 
37,41d33
<   # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
<   gem 'web-console', '>= 4.1.0'
<   # Display performance information such as SQL time and flame graphs for each request in your browser.
<   # Can be configured to work on production as well see: https://github.com/MiniProfiler/rack-mini-profiler/blob/master/README.md
<   gem 'rack-mini-profiler', '~> 2.0'
45,52d36
< end
< 
< group :test do
<   # Adds support for Capybara system testing and selenium driver
<   gem 'capybara', '>= 3.26'
<   gem 'selenium-webdriver'
<   # Easy installation and use of web drivers to run system tests with browsers
<   gem 'webdrivers'

通常モードではインストールされる Gem のいくつかが、API モードではインストールされないことがわかります。
対して、コメントアウトされていますが、CORS 用の Gem である rack-cors が API モードでは追加されています。

API モードの設定方法

実際に RailsAPI モードを利用する方法は次のとおりです。

rails new で、新規にプロジェクトを作る場合
rails new--apiをつけるだけです。

$ rails new app --api

既存プロジェクトをAPI専用に変更する場合 config/application.rbのApplicationクラス定義の冒頭に以下を追加します。

config.api_only = true

参考 railsguides.jp

終わり

Ruby on Rails はじめかた

Ruby on Rails 始めてみます。

とりあえず、Railsのインストールからサーバー起動して、「Yay! You’re on Rails!」を見るところまでやっていきます。

準備

Dockerの ruby:3 を使ってます。
Docker使わなくても、以下のものがあればOKです。

  • ruby をインストールしておきます。
    バージョンはこれ
$ ruby -v
ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-linux]
  • bundler をインストールしておきます。
    バージョンはこれ
$ bundle -v
Bundler version 2.2.15
  • Debian系 (apt-getを使います)

Railsのインストール

Gemfile を作成し、内容は以下の通りにする。

source 'https://rubygems.org'
gem 'rails', '~>6.x'

bundler を使ってインストールします。

$ bundle install

これでRailsはインストールされました。

$ rails -v
Rails 6.1.3.2

Railsプロジェクト作成

続いて、Railsのプロジェクトを作成します。

rails new . --force

と、するだけなんですが、途中で以下のエラーが出るので先に対応しておきます。

Node.js not installed. Please download and install Node.js https://nodejs.org/en/download/

Node.js がインストールされてないよ、ということです。
Node.js は apt-get を使って簡単にインストールできます。

apt-get update
apt-get install -y nodejs

Yarn not installed. Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/

こちらは、Yarn がインストールされてないよ、ということです。
Yarn も apt-get でインストールできるんですが、バージョンの問題があるので、リンク先のページの説明に従い以下のようにインストールします。

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
apt update && apt install yarn

※必要に応じて sudo をつかってください。

Node.js と Yarn がインストールできたら、Railsプロジェクトを作成できます。

rails new . --force

ちなみに、この --force オプションは、Gemfileを上書きするオプションです。

Railsサーバー起動

これで準備は整ったので、Railsを起動できます。

rails server -b 0.0.0.0

-b 0.0.0.0は、今回Dockerを使っているためつけています。
詳しくはググってください。

あとはブラウザからhttp://localhost:3000にアクセスすれば

f:id:utouto97:20210604174149p:plain

終わり