こんにちは、@codeship_techです。
今回は、Railsを例にとってコンソールログに出てくる内容や用語の解説をピックアップしました!
Rails以外でも役立つ知識ですので、ぜひ目を通して見てください!
Railsのコンソールで出てくる以下の「commit transaction」というログはエラー??
$ rails console
irb(main):005:0> Product.create(name: "Product1", description: "fisrt product")
(0.1ms) begin transaction
Product Create (2.3ms) INSERT INTO "products" ("name", "description", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["name", "Product1"], ["description", "fisrt product"], ["created_at", "2019-08-29 10:41:04.396182"], ["updated_at", "2019-08-29 10:41:04.396182"]]
(2.1ms) commit transaction
=> #<Product id: 1, name: "Product1", description: "fisrt product", created_at: "2019-08-29 10:41:04", updated_at: "2019-08-29 10:41:04">
エラーではなく、「正常にデータベースに変更を加え終えた」というメッセージです。
データベースに変更をくわえる手続きを「トランザクション」と言います。
ログはbegin transaction
の部分からデータの挿入を行い、それが「正常に完了した」ことを示す commit transaction
で締めくくられています。
- コミットとロールバックについて
トランザクションを行うとき、データベースに矛盾を起こすようなデータを挿入しないようにしなくてはなりません。
例えば、「ユーザー名を未入力の人を登録できないようにする」といったような制約を設ける必要があります。
その制約に引っかかり、矛盾したデータが挿入されそうになると、トランザクションは中断されデータベースは完全に前の状態に戻ります。
この巻き戻しを「ロールバック」と言います。
制約に引っかからず正常にデータの更新が行え、変更が反映されることを「コミット」と言います。
もし、以下のようなModelのバリデーションをつけていたとします。
app/models/product.rb
class Product < ApplicationRecord
validates :name, presence: true
end
Productのnameは空ではいけないというバリデーションなので、以下のようにnameが空の誤ったデータを挿入しようとしても、ロールバックされるわけですね。
$ rails console
irb(main):007:0> Product.create(description:"second product")
(0.4ms) begin transaction
(0.1ms) rollback transaction
=> #<Product id: nil, name: nil, description: "second product", created_at: nil, updated_at: nil>
ちなみに直接createするのではなく、newしてからセーブする方法だと、newした段階で正常かどうか判断できます。
$ rails console
irb(main):001:0> p = Product.new(description: "third product")
=> #<Product id: nil, name: nil, description: "third product", created_at: nil, updated_at: nil>
irb(main):002:0> p.valid?
=> false
irb(main):003:0> p.errors.messages
=> {:name=>["can't be blank"]}
irb(main):004:0> p.save
(0.4ms) begin transaction
(0.1ms) rollback transaction
=> false
ログが大量に出てきたからといって、間違った動作をしているという訳でもないときもあります。
ログはフレームワークや言語の設計者からの親切なメッセージですので、必ず目を通してあげてください。
授業日記についてのご意見
CodeShipの授業について「こんな事が知りたい・紹介して」というご意見・ご提案がありましたら、CodeShip公式Twitterアカウント(【CodeShip】プログラミングスクール)までDMまたはリプライにてお寄せください。