Ruby+SQLite3

#### 投稿目的
- 個人の学習目的で投稿していきます。

## RDB(リレーショナルデータベース)
- RDBとはSQLを扱うことのできるデータベースのことをいいます。
- データを操作する際に用いるコマンドをSQLと呼びます。
- RDBとして代表的なものに、Oracle, MySQL, PostgreSQL, SQLite3があります。

## SQLite3
- SQLiteはRDB形式のデータベースまたはデータベース管理ソフトです。
- SQLite3は軽量で、比較的小さいサイズのデータを扱うのに適しています。

### SQLite3の準備
- RubyでSQLite3を利用する際はgemのSQLite3ライブラリをインストールします。

```shell:ターミナル
$ gem install sqlite3 # sqlite3インストール
```

- インストールしたらrequireでSQLite3を読み込みます。

```ruby
require 'sqlite3' # sqlite3読み込み
```

### SQLite3の使用方法
- SQLite3を利用するにはまずはターミナルで適当な名前に拡張子「.db」を付けて実行することでインタラクティブモードへと切り替わりコマンドを使用することができます。
- インタラクティブモード = 対話モード.

```shell:ターミナル
$ sqlite3 ファイル名.db # 適当な名前で実行
SQLite version 3.24.0 2018-06-04 14:10:15 # SQLiteのバージョン
Enter ".help" for usage hints.
sqlite> # インタラクティブモード
```

###### 補足: ターミナルに「.help」と入力して実行するとSQLiteのコマンドの使用方法が表示されます。

### ファイル作成
- インタラクティブモードに切り替わったら次に「.open」コマンドでファイルを作成します。

```sql:ターミナル
sqlite>.open ファイル名.db # ファイルを作成
```

## SQL
- SQLはデータベースを管理するソフトウェアを操作、制御などをするデータベース言語です。
- SQLは大文字/小文字区別はされません。
- 文末には必ず;(セミコロン)を忘れずに記述します。

### テーブル作成
- SQLのcreate tableでテーブルを作成します。
- カラム = 行.

```sql:ターミナル
sqlite>CREATE TABLE テーブル名(
    カラム名1,データ型 
    カラム名2,データ型
);
```

### データ追加
- insert文を使用することでカラムを指定してデータを追加することができます。
- カラムを指定することでどの行に追加するかを指定しています。
- valueの引数に追加するデータを記述します。

```sql:ターミナル
sqlite>INSERT INTO テーブル名(カラム名) VALUE(値);
```

### データ読み込み
- SELECT文を使用することでテーブルないのデータを表示することができます。
- カラムを指定してどの行のデータを表示するかを指定します。
- カラムの部分に*(アスタリスク)を利用することでテーブルのデータ全てを表示することが可能です。

```sql:ターミナル
sqlite>SELECT カラム名 FROM テーブル名;
```

### データ更新
- UPDATE文を使用してデータを更新することができます。
- WHEREで条件を指定しないと指定したカラム名のデータ全てが更新されます。

```sql:ターミナル
sqlite>UPDATE テーブル名 SET カラム名 = '更新値' WHERE カラム名 = '値' 
```

### データ削除
- DELETE文を使用してデータを削除することができます。
- WHEREは条件を指定しています。
- 条件を指定しない場合すべてのデータが削除されます。
- どの行のデータを削除するかを指定しています。

```sql:ターミナル
sqlite>DELETE FROM テーブル名 WHERE カラム名 = '値';
```

### テーブル削除
- DROP TABLEでテーブルを削除することができます。

```sql:ターミナル
sqlite>DROP TABLE テーブル名;
```

## erbファイル内でのRubyの記述
- HTMLの場合はそのまま記述する事で利用ができます。

```erb:test.erb
<!DOCTYPE html>
<html>
    <head>
        <meta charset='UTF-8'>
        <title>HTML</title>
    </head>
    <body>
        <h1>おはようございます。</h1>
    </body>
</html>

<!-- 結果: タブ名は'HTML'、ブラウザ上に'おはようございます'と表示 -->
```

- Rubyを記述する際は<%〜%>と<%=〜%>で囲んでRubuを記述します。
- <%〜%>にはRubyの定義を記述して、<%=〜%>は結果を表示する。
- timesメソッドは指定した回数、繰り返し処理を行います。
- 「do~end」をブロックといい、この中に処理を記述します「{}」でもブロックと適用されます。

```erb:test.erb
<!DOCTYPE html>
<html>
    <head>
        <meta charset='UTF-8'>
        <title>HTML</title>
    </head>
    <body>
    <!-- Ruby -->
        <!-- 指定した回数処理を繰り返す -->
        <% 3.times do %>  
            <!-- 処理内容 -->
            <p>おはよう</p> 
        <% end %> 
        <!-- test変数に文字列を代入 -->
        <% test = 'こんばんは' %>
        <!-- 変数の値を表示 -->
        <%= test %>
    <!-- Ruby -->
        <h1>おはようございます。</h1>
    </body>
</html>

<!-- 結果: ブラウザ上に3回'おはよう'、test変数の'こんばんは'が表示 -->
```

## RubyとSQLite3利用方法
- erbファイルでDBの接続、操作などを記述する際も<%〜%>、<%=〜%>を利用します。

### DB接続
- DBを接続することでSQL文を利用してDBの操作をする事ができます。


```ruby
変数名 = SQLite3::Database.new( 'ファイル名' )
```

### DB操作
- executeメソッドでSQLを実行する事ができます。
- DBを操作する際にSQL文を利用しますがSQLにはSQLインジェクションが存在するのでそれを防ぐにはプレースホルダーという記述方法が存在します。

```ruby
DB接続変数.execute(SQL)
```

## SQLインジェクション
- インジェクション = 注入.
- アプリケーションが想定していないSQL文を実行させることをSQLインジェクションという。

## executeメソッドの引数に直接SQLを記述して実行 
- database.execute(SQL)
- 直接記述する際にvalueの引数にインスタンス変数を記述する際は式展開「#{}」を利用します。
- SQLインジェクションの危険性があり。
 
```ruby

database.execute("INSERT INTO shop(naem, category) VALUES('#{@shop}', '#{@category}')")
```

## プレースホルダー
- 実際の内容を後から挿入したい為に仮に確保した場所。
- SQLインジェクションを防ぐ為にプレースホルダーを利用する。

## 名前なしのプレースホルダー
- 変数 = SQL
- database.execute(変数, 値);
 
```ruby
sql = 'INSERT INTO shop(naem, category) VALUES(?, ?)'
database.execute(sql, @shop, @category)
```

## 名前ありのプレースホルダー
- 名前ありの場合はvalue引数の順番を変更しても問題ない。

```ruby

sql = 'INSERT INTO shop(naem, category) VALUES(:name, :category)'
database.execute(sql, :category => @category, :name => @shop)
```

- closeメソッドを利用する事でDBを閉じることができます.

```ruby

database.close
```

- erbファイルでSQLite3とSQLの記述

```erb:test.erb
<!DOCTYPE html>
<html>
    <head>
        <meta charset='UTF-8'>
        <title>SQLite3</title>
    </head>
    <body>
        <!-- SQLite3を使用した記述 -->
        <!-- 接続 -->
        <% db = SQLite3::database.new('dbファイル名') %>
        <!-- SQL実行 -->
        <% sql = 'SELECT * FROM テーブル名' %>
        <% db.execute(sql) do |変数名| %>
            <%= 変数名 %>
        <% end %>
        <!-- DB切断 -->
        <% db.close %>
        <!-- SQLite3 -->
    </body>
</html>

<!-- 結果: ブラウザ上にデータベースのデータを表示 -->
```