PostgreSQL 練習 (準備1)
前回、PostgreSQL について調べてみました。
そして、Docker を使って PostgreSQL サーバを構築し、
psql
コマンドで操作できるようになりました。
今回からは、この PostgreSQL を使って、Qiita で見つけた SQL の練習問題に取り組んでいきたいと思います。
SQL 練習問題
Qiita で見つけた SQL の練習問題というのは ↓ になります。
この記事の中では
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)
これで準備が整ったので、次回から問題を解いていきます。
参考
終わり
PostgreSQL 入門
リレーショナル型のデータベースの一つであるPostgreSQL 。
今まで触ったことないので、今回すこし調べてみました。
PostgreSQL とは
PostgreSQL はフリーでオープンソースな、オブジェクトリレーショナルデータベース管理システム (ORDBMS) です。
また、PostgreSQL はカリフォルニア大学バークレイ校で作成された POSTGRES パッケージの派生です。
データベース管理システム (DBMS) とは、データベースの運用、管理のためのシステムやソフトウェアのことです。
そして、オブジェクトリレーショナルデータベース管理システム (ORDBMS) とは、リレーショナルデータベース管理システムの一種で、
データ型とメソッド(オブジェクト指向でいうオブジェクトのクラス)を自由に定義し、開発に利用できるデータベース管理システムのことです。
PostgreSQLの特徴としては、
- リレーショナル型のデータベース管理システム
- フリー・オープンソースであること
さらに自由主義的ライセンス条件により、PostgreSQLは誰にでも、その使用、変更 、配布を個人使用、商用、学術など目的に限らず無償で可能です。
- 日本語も対応している
などが、あります。
このほかにもたくさんあります。
Docker で PostgreSQL を試す
実際に PostgreSQL を試してみます。
今回は PostgreSQL を直接インストールするのではなく、Docker を使ってやっていきます。
Dockerhub には PostgreSQL のイメージも公開されているので、これをそのまま利用します。
まずは、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
rails も MVC です。
ところで 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 ページ表示までの流れ
- ユーザーからのリクエスト
- Controller がリクエストを処理
- 場合に応じて、Model に処理要求
- Model は DB にアクセスし、Controller へデータを返す
- Controller は View にデータを渡して、出力を指示する
- View はユーザーに HTML 等のファイルを出力
MVC のメリット
MVC のメリットは Model View Controller に分離できるということです。
分離することによって、
- 分業できる
- それぞれの依存性を減らすことができる
- 共通しているものや似ているものを再利用しやすくなる
- 保守性が高まる
といった、メリットがあります。
終わり
Rails APIモード
Railsを使った開発をしたいと思っています。
一方でフロントエンドに React や Vue を使いたいという気持ちもあります。
ということで、Rails でバックエンドの API サーバーを構築し、
フロントエンドは React や Vue を使っていきたいと思います。
API とは
APIとは、「 Application Programming Interface 」のアクロニムです。
外部とやり取りをする窓口にあたるもので、
機能の一部を外部に提供するのに使われます。
例えば、Twitter API ではツイートを取得することができます。
ドキュメントホーム | Docs | Twitter Developer
ぐるなびAPIでは飲食店情報を取得することができます。
ぐるなび Web Service - トップページ
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 モードの設定方法
実際に Rails で API モードを利用する方法は次のとおりです。
rails new
で、新規にプロジェクトを作る場合
rails new
に --api
をつけるだけです。
$ rails new app --api
既存プロジェクトをAPI専用に変更する場合
config/application.rb
のApplicationクラス定義の冒頭に以下を追加します。
config.api_only = true
終わり
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
にアクセスすれば
終わり