投稿目的
- 個人の学習目的で投稿していきます。
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>
<!-- 結果: ブラウザ上にデータベースのデータを表示 -->