Herokuでデータベースをリセットする方法

 Herokuで公開したアプリのデータベースをリセットする方法を書いておきます。

 ターミナルで下記のコマンドを実行してメールアドレスとパスワードを入力します。

 
% heroku login --interactive
 

 その後下記のコマンドを実行します。

 
% heroku run DISABLE_DATABASE_ENVIRONMENT_CHECK=1 rails db:drop db:create db:migrate
 

 これでデータベースのリセットが完了です。

 

 

 

 

トランザクションとは

 データベースのトランザクションとは複数の処理のまとまりのことです。1つの処理ではなくワンセットになった複数の処理になります。

 複数の処理をまとめるとはどういうことかを僕なりにイメージしてみました。

 

 もともと財布に1万円が入っていて2つの処理を行ったとします。

  1. 朝に7000円分の買い物をする
  2. 夕方に銀行から5000円引き出して財布に入れる

 この1連の流れの中で最終的に財布に入っているのは8000円になっているはずです。しかしもしこれらの処理を別々に切り出してしまうと、夕方になってなぜ財布に3000円しか残っていないのかが分からなくなってしまいます。そうならないように複数の処理を連結させてまとめるのです。

 

ACID特性とは

 このトランザクションには4つの特性が標準規格によって決められているみたいです。

  1. 原子性/不可分性(Atomocity)
  2. 一貫性/整合性(Consistency)
  3. 独立性/隔離性(Isolation)
  4. 永続性/耐久性(Durability)

 以上の4つです。

 

原子性(Atomocity)

 トランザクションに含まれる複数の処理は、「全て実行される」か「1つも実行されない」のどちらかになるということ。

一貫性(Consistency)

 トランザクションの前後で矛盾が生じないこと。もし制約違反の処理があった場合は処理が中断されて実行前に戻される。

独立性(Isolation)

 トランザクションの処理過程は外部からは隔離されているため、その他のトランザクションの影響を受けないこと。

永続性(Durability)

 トランザクションが完了した後、保存されたデータは失われないこと。データ操作の時系列の記録(ログ)がストレージに保存されるため、障害で処理が中断しても、ログを元にして障害発生前に復旧する。

 

 

 

 以上です。データベースに関してはほとんど扱っていない状態で知識を言語化して整理してみました。間違ったことを言っていたら指摘していただけると助かります。

 またこちらの記事を参考にしました。

データベースさわったこと無い新人向けトランザクション入門 - Qiita

 

 

 

 

 

 

 

 

 

SQLとは

 SQL(Structured English Query Language)とは、リレーショナルデータベース管理システムと対話するための言語です。

 まずデータベースとは何かしらの目的やルールに基づいて整理されたデータのまとまりのことです。そのデータベースの中には、階層型やネットワーク(網)型があります。その中で最もよく使われるのがリレーショナル型のデータベースです。

 リレーショナルデータベースは、行(row)と列(column)で表されたテーブル同士が連携して動く仕組みを持っています。

 

SQLの概要

 データベース言語であるSQLはデータベースに対して、データの挿入のような要求を呼びかける際に使われます。このようにデータベースに要求を出す命令文クエリ(問い合わせ)と言います。クエリの中身であるSQL文はユーザーが作成する場合やソフトウェアが作成してくれる場合があります。

 データベースに対する連続した複数の処理を1つのプログラムにまとめて、データとともに保存できるようにした機能ストアドプロシージャと言います。現在ではSQLにこのようなプログラミング機能が加わっています。

 

制約

 登録するデータを正しい状態に保つために様々な制約というものが存在します。同姓同名の人物でも区別できるように学生番号を振った際、この学生番号のことを主キー(Primary Key)と言います。また複数の列(column)を組み合わせて1つのキーとした場合は、これを連結キー(複合キー)と言います。「県」と「市」を別々の列で登録したとしてもそれぞれの列を連結キーとして設定しておくと、1つの地域を特定できるようになります。制約には他にも、データに一意性を持たせるUNIQUE、空の値を禁止するNOT NULL、条件に合わないデータを禁止するCHECK(条件式)などがあります。

 

SQLクエリ(SQL文)の7つの種類

 データベースに対する命令文の種類には以下のようなものがあります。

  1. CREATE:データベース・テーブル作成
  2. ALTER:データベース・テーブル定義変更
  3. DROP:データベース・テーブル削除
  4. SELECT:データ検索
  5. UPDATE:データ更新
  6. INSERT:データ挿入
  7. DELETE:データ削除

 

 プログラミング初心者なりにSQLについて頭を整理してまとめてみました。とりあえずSQLは「言語」であり、クエリは「命令文」です。

 もし間違っていることを言っていたら指摘していただけるとありがたいです。参考にした記事はこちらです。

SQLって何? - Qiita

 

 

 

 

 

 

 

 

HTTPとは

 HTTP(Hyper Text Transfer Protocol)通信とはWebアプリケーションとPC間でHTMLのような情報やデータを送受信する通信方法のことです。

 手紙を送るまでの流れに例えると、HTTP通信が書留や速達といった送り方の種類を指し、URL(Uniform Resource Locator)が送り先の住所になります。

 PC(クライアントサイド)がWebアプリケーション(サーバーサイド)に対してデータや情報を要求することを「リクエスト」と言ます。そしてWebアプリケーションがその要求された情報をPCに返却することを「レスポンス」と言います。

 

 

HTTPリクエス

 前述したようにHTTPリクエストはブラウザ(クライアントサイド)からサーバーサイドに送るものです。つまりHTTPリクエストを作るのはブラウザです。このHTTPリクエストには「HTTPリクエスト行」、「HTTPヘッダー」、「データ本体」が含まれます。

HTTPリクエスト行

 HTTPリクエストの1行目であるHTTPリクエスト行には主に「GET」というメソッド、「URL」、「HTTPのバージョン」が入っています。メソッドが「POST」(フォームから情報を送信するとき)の場合はHTTPヘッダーの後にデータ本体が続きます。

HTTPヘッダー

 2行目以降のHTTPヘッダーには、ユーザーエージェント名やクッキーなどの情報が含まれます。ユーザーエージェント名はブラウザやOSの種類であり、クッキーはログイン状態を続けるためにブラウザに保存されるデータのようなものです。他にもどのページから発生したリクエストなのかを示すリファラや、どんなデータを受け取りたいかといった情報が含まれます。

 

 

HTTPレスポンス

 HTTPレスポンスはサーバーサイドからブラウザ(クライアントサイド)に送るものであるため、サーバーが作ります。HTTPレスポンスには「レスポンス状態行(HTTPステータスコード)」、「HTTPヘッダー」、「データ本体」が含まれます。

HTTPステータスコード

 HTTPステータスコードはリクエストに対する返答の状態を示します。

100番台は処理の継続中であり、200番台は処理の成功を意味します。300番台はリダイレクト、400番台はクライアント側のエラーを表します。401は「ユーザー認証が必要」、404は「見つかりませんでした」という意味になります。そして500番台はサーバー側のエラーです。

HTTPヘッダー

 HTTPヘッダーにはコンテンツタイプやデータの最終更新日時やエンティティ情報などが含まれます。コンテンツタイプとは、データがHTMLか画像かといった情報や文字コードなどの情報を示すものです。他にも接続状況やリダイレクト先などの情報も入っています。

 

 

 自分の頭を整理する目的でHTTPについて書いてみました。こちらの記事を参考にしました。

HTTPリクエスト/レスポンスとは? HTTPヘッダーを理解しよう | 初代編集長ブログ―安田英久 | Web担当者Forum

 

 

 

 

 

 

 

 

Webサーバーとアプリケーションサーバー

 サーバーとは、Webアプリケーションの保存先であり、画面のないPCです。そのサーバーサイドの中身は大きく3つに分けられます。Webサーバー、アプリケーションサーバー、データベースサーバーです。

 その中でもWebサーバーとアプリケーションサーバーについて説明したいと思います。

 

Webサーバー

 Webサーバーとは、CSSファイルのように、リクエストのたびに内容が変更されない静的コンテンツのみをリクエストとしてクライアントに返すものです。サイトを閲覧するブラウザを指します。Webサーバーの一種としてNginx(エンジンエックス)があります。

 

アプリケーションサーバ

 アプリケーションサーバーは、リクエスト毎にデータベースから検索条件に当てはまるデータを取得して表示する役割を持つ、動的コンテンツを生成します。この処理結果をWebサーバーに返します。

 扱っているものが静的コンテンツのみの場合はWebサーバーだけでリクエストに対応してレスポンスを返します。一方でデータを扱っている場合は一旦アプリケーションサーバーを介してレスポンスするイメージだと僕は解釈しました。

 こういった処理の流れの中で、アプリケーションサーバーとアプリケーション本体は使用している言語が異なるという問題があります。この問題はRackという翻訳プログラムが解決してくれています。

 

 

 

 

 

 

ゲッターとセッター

 値の取得ができるメソッドの定義をゲッター、値の更新ができるメソッドの定義をセッターと言います。ゲッターは、クラスに設定したインスタンス変数の値をインスタンスから読み取って表示するためだけに存在します。そしてその値を更新するためのものがセッターです。

 

class Human
def initialize
puts "名前を入力してください"
@name = gets.chomp
puts "住所を入力してください"
@address = gets.to_i
end

#ゲッター
def name
@name
end

def address
@address
end

#セッター
def name=(set)
@name = set
end

def address=(set)
@address = set
end
end

 

 そしてそのゲッターとセッターの両方の役割を果たすものとして「attr_accessor」があります。attr_accessorの記述をした場合はおそらくこんな感じになります。

class Human
attr_accessor :name, :address
def initialize
puts "名前を入力してください"
@name = gets.chomp
puts "住所を入力してください"
@address = gets.to_i
end
end

 

 もし間違っていることを言っているようだったら修正いたします。

 

 

 

 

 

 

オブジェクト指向とは

 オブジェクト指向について説明します。オブジェクト指向とはデータや処理のまとまりごとに分けて実装する、設計思想の1つです。モデル、コントローラー、ビューに分けて実装することもオブジェクト指向です。

 

 ではオブジェクト指向を意識していないアプリケーションとはどのようなものだと言えるでしょうか。

 オブジェクト内に様々な役割が入り込んでいて、どこに何があるのかが分からないものや、1つの機能を変えた途端に、その変更とは関係ないはずの機能が動かなくなってしまうものなどがそうでしょう。

 オブジェクトを綺麗に切り分けなくてもとりあえず動くアプリを作ってしまったり、途中で仕様変更したり、設計思想が異なる者同士でアプリを開発したりすることでそのようなことが起きると言えます。