23
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ruby+SQLite3

Last updated at Posted at 2019-02-22

投稿目的

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

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>

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?