投稿目的
- 個人の学習目的で投稿していきます。
 
RDB(リレーショナルデータベース)
- RDBとはSQLを扱うことのできるデータベースのことをいいます。
 - データを操作する際に用いるコマンドをSQLと呼びます。
 - RDBとして代表的なものに、Oracle, MySQL, PostgreSQL, SQLite3があります。
 
SQLite3
- SQLiteはRDB形式のデータベースまたはデータベース管理ソフトです。
 - SQLite3は軽量で、比較的小さいサイズのデータを扱うのに適しています。
 
SQLite3の準備
- RubyでSQLite3を利用する際はgemのSQLite3ライブラリをインストールします。
 
ターミナル
$ gem install sqlite3 # sqlite3インストール
- インストールしたらrequireでSQLite3を読み込みます。
 
require 'sqlite3' # sqlite3読み込み
SQLite3の使用方法
- SQLite3を利用するにはまずはターミナルで適当な名前に拡張子「.db」を付けて実行することでインタラクティブモードへと切り替わりコマンドを使用することができます。
 - インタラクティブモード = 対話モード.
 
ターミナル
$ sqlite3 ファイル名.db # 適当な名前で実行
SQLite version 3.24.0 2018-06-04 14:10:15 # SQLiteのバージョン
Enter ".help" for usage hints.
sqlite> # インタラクティブモード
補足: ターミナルに「.help」と入力して実行するとSQLiteのコマンドの使用方法が表示されます。
ファイル作成
- インタラクティブモードに切り替わったら次に「.open」コマンドでファイルを作成します。
 
ターミナル
sqlite>.open ファイル名.db # ファイルを作成
SQL
- SQLはデータベースを管理するソフトウェアを操作、制御などをするデータベース言語です。
 - SQLは大文字/小文字区別はされません。
 - 文末には必ず;(セミコロン)を忘れずに記述します。
 
テーブル作成
- SQLのcreate tableでテーブルを作成します。
 - カラム = 行.
 
ターミナル
sqlite>CREATE TABLE テーブル名(
    カラム名1,データ型 
    カラム名2,データ型
);
データ追加
- insert文を使用することでカラムを指定してデータを追加することができます。
 - カラムを指定することでどの行に追加するかを指定しています。
 - valueの引数に追加するデータを記述します。
 
ターミナル
sqlite>INSERT INTO テーブル名(カラム名) VALUE(値);
データ読み込み
- SELECT文を使用することでテーブルないのデータを表示することができます。
 - カラムを指定してどの行のデータを表示するかを指定します。
 - カラムの部分に*(アスタリスク)を利用することでテーブルのデータ全てを表示することが可能です。
 
ターミナル
sqlite>SELECT カラム名 FROM テーブル名;
データ更新
- UPDATE文を使用してデータを更新することができます。
 - WHEREで条件を指定しないと指定したカラム名のデータ全てが更新されます。
 
ターミナル
sqlite>UPDATE テーブル名 SET カラム名 = '更新値' WHERE カラム名 = '値' 
データ削除
- DELETE文を使用してデータを削除することができます。
 - WHEREは条件を指定しています。
 - 条件を指定しない場合すべてのデータが削除されます。
 - どの行のデータを削除するかを指定しています。
 
ターミナル
sqlite>DELETE FROM テーブル名 WHERE カラム名 = '値';
テーブル削除
- DROP TABLEでテーブルを削除することができます。
 
ターミナル
sqlite>DROP TABLE テーブル名;
erbファイル内でのRubyの記述
- HTMLの場合はそのまま記述する事で利用ができます。
 
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」をブロックといい、この中に処理を記述します「{}」でもブロックと適用されます。
 
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の操作をする事ができます。
 
変数名 = SQLite3::Database.new( 'ファイル名' )
DB操作
- executeメソッドでSQLを実行する事ができます。
 - DBを操作する際にSQL文を利用しますがSQLにはSQLインジェクションが存在するのでそれを防ぐにはプレースホルダーという記述方法が存在します。
 
DB接続変数.execute(SQL)
SQLインジェクション
- インジェクション = 注入.
 - アプリケーションが想定していないSQL文を実行させることをSQLインジェクションという。
 
executeメソッドの引数に直接SQLを記述して実行
- database.execute(SQL)
 - 直接記述する際にvalueの引数にインスタンス変数を記述する際は式展開「#{}」を利用します。
 - SQLインジェクションの危険性があり。
 
database.execute("INSERT INTO shop(naem, category) VALUES('#{@shop}', '#{@category}')")
プレースホルダー
- 実際の内容を後から挿入したい為に仮に確保した場所。
 - SQLインジェクションを防ぐ為にプレースホルダーを利用する。
 
名前なしのプレースホルダー
- 変数 = SQL
 - database.execute(変数, 値);
 
sql = 'INSERT INTO shop(naem, category) VALUES(?, ?)'
database.execute(sql, @shop, @category)
名前ありのプレースホルダー
- 名前ありの場合はvalue引数の順番を変更しても問題ない。
 
sql = 'INSERT INTO shop(naem, category) VALUES(:name, :category)'
database.execute(sql, :category => @category, :name => @shop)
- closeメソッドを利用する事でDBを閉じることができます.
 
database.close
- erbファイルでSQLite3とSQLの記述
 
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>
<!-- 結果: ブラウザ上にデータベースのデータを表示 -->