前回の続き。
前回はモデルを見て行ったので、今回はdatabaseディレクトリ を見ていく!
create_database.sql
ここにデータベースやテーブル作成のSQLを書いてくっぽいけど、どんなコマンドを実行したら
データベースが作られるのかは全く分からない。そこからイメージがついてない。
てか、ここにSQL文書いても、まずデータベースに接続ができるのかが怪しい。
確かにクライアントは定義したけど、別のディレクトリのファイルに定義したから
それをどう連携させるのか。include db.rbとかするわけでもなさそうだし。
一旦、そこは飛ばしてどんなコードか理解していくとする
CREATE DATABASE IF NOT EXISTS 0ch;
まぁこれはそのままで、Ochって名前のデータベースがなければ、
そのデータベースを作るって感じです。
next!
create_post.sql
CREATE TABLE IF NOT EXISTS posts (
id INTEGER UNSIGNED AUTO_INCREMENT NOT NULL,
topic_id INTEGER UNSIGNED NOT NULL,
name VARCHAR(255),
email VARCHAR(255),
body TEXT NOT NULL,
created_at DATETIME NOT NULL,
PRIMARY KEY (id)
);
IDカラムのデータ型はINTEGERで数値が入っていく
UNSIGNED AUTO_INCREMENT
は、https://kin-memo.hatenablog.com/entry/2018/02/07/182952
この記事にある通りで
UNSIGNEDは、正の数値のみ受け付ける感じ。
AUTO_INCREMENTはその名の通り。
レコードが追加されると、自動的に付与される。今回付与されるのはid
レコードが追加されるたび、idカラムにインクリメントされた数値が追加されていく。
NOT NULLはその名の通り、このカラムには絶対何かしらの値が入っていなきゃいけない。といった制約。
topic_idがなぜあるかというと、
一つのトピックに、いくつもの投稿が紐ずくので、
どのトピックに対する投稿かを識別できるように、
外部キーを設定する必要がある。
PRIMARY KEY(主キー)とは作成したテーブルの中の1つまたは複数のカラムの組み合わせに対して設定するもので、テーブルに格納されているデータをに格納されているデータを識別するための目印のようなものです。
まぁ確かにプライマリーキーがあれば、id=3でそのデータが参照できるってわけか。
プライマリーキーに指定したカラムは重複とNULLを受け付けないようになる。
受け付けたら識別できなくなるからね
てか、railsで開発してた頃は、プライマリキーを指定した覚えなんてないんだが、、
それなのに困ったことなかった。。。。なんでやねん。。。
sinatraとrailsを行き来すれば、理解深まりそうと思った。
railsの仕組みについても興味が湧いてきますね。
create_topics.sql
CREATE TABLE IF NOT EXISTS topics (
id INTEGER UNSIGNED AUTO_INCREMENT NOT NULL,
title VARCHAR(255) NOT NULL,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
PRIMARY KEY (id)
);
まぁ、さっき解説した通りですね〜。
app.rb
ついでにapp.rbも見ておきましょう。
require 'sinatra'
require 'slim'
require_relative 'models/topic'
require_relative 'models/post'
get '/' do
@topics = Topic.all
slim :index
end
post '/topics' do
topic = Topic.new(title: params[:title])
topic.save
redirect '/'
end
get '/topics/:id' do
@topic = Topic.find(params[:id])
@posts = Post.of_topic(@topic.id)
slim :show
end
post '/topics/:topic_id/posts' do
name = params[:name].empty? ? '名無し' : params[:name]
post = Post.new(name: name, email: params[:email], body: params[:body], topic_id: params[:topic_id])
post.save
redirect back
end
なんだかroutes.rbみたい
まぁ、なんとなくわかるので、大丈夫でしょう。
次回はいよいよ、アプリを実行していきたいと思います。
コードを書いたはいいけど、何のコマンドを打てば
データベース作られたりするのかがいまいちよく分からないですね。