初心者向け
                                   SQLite の始め方
                                            SQLite Beginners Talk

                                                  suno (すの)
                                                              2012-06-23



初心者向け SQLite の始め方 - SQLite Beginners Talk       Powered by LibreOffice Impress 3.5.4.2
自己紹介
●
    春原 宏保 (すのはら ひろやす
●
    プログラマー (Win32、Web)
    ●   長野市内の SIer 勤務
    ●   Delphi、PHP、C#、
        C++、Java、
        JavaScript...
今日のお題は──




   軽量データベースエンジン SQLite
SQLite とは
●
    ファイルベースの RDBMS
●
    ユーザー権限とか、面倒な話は一切なし
●   小さくて軽い!
    ●   Windows 版 sqlite3.dll (Version 3.7.13)
        599,419 バイト
●
    高い信頼性
    ●   バージョンアップして後悔した経験皆無(※)

                                                 (※) 個人の感想です
高い信頼性
●
    SQLiteのテストコードは4567万8000行! 本
    体のコードは6万7000行
    http://www.publickey1.jp/blog/10/sqlite45678000_67000.html
困ったら公式サイトへ
●   公式サイト http://www.sqlite.org/
●   公式 Wiki http://www.sqlite.org/cvstrac/wiki
SQLite のデータ型
●
    以下の 5 つしかない
    ●   NULL
    ●   INTEGER
    ●   REAL
    ●   TEXT
    ●   BLOB
●
    Datatypes In SQLite Version 3
    http://www.sqlite.org/datatype3.html
まずは使ってみよう
●
    コマンドラインシェルで SQLite を体験
●
    コンソールから「sqlite3 データベース名」
    と入力
例
C:docnsegsqlite>sqlite3 hoge.db
SQLite version 3.7.13 2012-06-11 02:05:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> CREATE TABLE test (
   ...> id INTEGER PRIMARY KEY NOT NULL,
   ...> name TEXT NOT NULL DEFAULT '');
sqlite> INSERT INTO test (id, name)
   ...> VALUES (1, 'Foo Bar');
sqlite> INSERT INTO test (id, name)
   ...> VALUES (2, 'Hoge Fuga');
sqlite> SELECT * FROM test;
1|Foo Bar
2|Hoge Fuga
sqlite> .q

C:docnsegsqlite>
PHP から SQLite を使う
●
    php.ini で
    ;extension=php_pdo_sqlite.dll
    の行を有効にすると、PDO で SQLite が
    使えるようになる
<?php
// 接続
if (!$db = new PDO("sqlite:test.db")) {
  die("DB connection failed.");
}

// CREATE TABLE
$sql = <<< __EOHD
CREATE TABLE Test (
   id INTEGER PRIMARY KEY NOT NULL,
   name TEXT NOT NULL DEFAULT ''
);
__EOHD;
if (!$db->query($sql)) {
   die("Create table failed.");
}
// INSERT
$stmt = $db->prepare("INSERT INTO test(id, name) " .
                     "VALUES (:id, :name)");
$arg = array(':id' => 1,
             ':name' => "Foo Bar");
if (!$stmt->execute($arg)) {
  echo "Insert failed.";
}
$arg = array(':id' => 2,
             ':name' => "Hoge Fuga");
if (!$stmt->execute($arg)) {
  echo "Insert failed.";
}

// SELECT
$stmt = $db->prepare("SELECT * FROM Test ORDER BY id");
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  $id = $row['id'];
  $name = $row['name'];
  echo "id: $id, name: $namen";
}
INSERT 時の注意
●
    大量の行を INSERT する場合は、必ず
    トランザクションで挟むこと!
    ●   さもないと、ものすごく時間が掛かる
⼤量 INSERT の例
<?php
// 接続
$db = new PDO("sqlite:trans.db");

// CREATE TABLE
$sql = <<< __EOHD
CREATE TABLE Test (
   id INTEGER PRIMARY KEY NOT NULL,
   value INTEGER NOT NULL
);
__EOHD;
$db->query($sql);

// 開始時刻
$start_time = microtime(true) * 1000;   // ミリ秒
// トランザクション開始
$db->beginTransaction();

// 1,000 件 INSERT
$stmt = $db->prepare("INSERT INTO test(id, value) " .
                     "VALUES (:id, :value)");
for ($i = 1; $i <= 1000; ++$i) {
  $arg = array(':id' => $i,
               ':value' => mt_rand());
  $stmt->execute($arg);
}

// トランザクション終了
$db->commit();

// 終了時刻
$end_time = microtime(true) * 1000;   // ミリ秒

echo ($end_time - $start_time) . "ms elapsed.n";
実際にやってみると……
●
    トランザクションあり → 0.028 秒
●
    トランザクションなし → 7.232 秒



          INSERT 時には
         トランザクションを
            忘れずに!!
【特集】生まれ変わるPHP - Zend Engine
2、SQLiteの実力は? (8) MySQLとSQLiteの比較 -
大量のデータの書込みでは?
http://news.mynavi.jp/special/2004/php5/007.html

  このスクリプトは、両者とも全く同じく1000件の
  データを連続して挿入する。実行結果は、予想外に
  圧倒的な大差がついた。
  (SQLite = 16.4 秒、MySQL = 0.4 秒)
  さすがはMySQLといったところだが、SQLiteの16秒は
  ちょっとかかりすぎだろう。どうやら大量データの連続
  挿入はSQLiteの不得意な処理のようだ。


                         ※「お詫びと訂正」が追記されています
かわいいよ
 SQLite
かわいいよ
おしまい。


                     suno (すの)
Inspired by @tmtms      suno88

初心者向け SQLite の始め方

  • 1.
    初心者向け SQLite の始め方 SQLite Beginners Talk suno (すの) 2012-06-23 初心者向け SQLite の始め方 - SQLite Beginners Talk Powered by LibreOffice Impress 3.5.4.2
  • 2.
    自己紹介 ● 春原 宏保 (すのはら ひろやす ● プログラマー (Win32、Web) ● 長野市内の SIer 勤務 ● Delphi、PHP、C#、 C++、Java、 JavaScript...
  • 3.
    今日のお題は── 軽量データベースエンジン SQLite
  • 4.
    SQLite とは ● ファイルベースの RDBMS ● ユーザー権限とか、面倒な話は一切なし ● 小さくて軽い! ● Windows 版 sqlite3.dll (Version 3.7.13) 599,419 バイト ● 高い信頼性 ● バージョンアップして後悔した経験皆無(※) (※) 個人の感想です
  • 5.
    高い信頼性 ● SQLiteのテストコードは4567万8000行! 本 体のコードは6万7000行 http://www.publickey1.jp/blog/10/sqlite45678000_67000.html
  • 6.
    困ったら公式サイトへ ● 公式サイト http://www.sqlite.org/ ● 公式 Wiki http://www.sqlite.org/cvstrac/wiki
  • 7.
    SQLite のデータ型 ● 以下の 5 つしかない ● NULL ● INTEGER ● REAL ● TEXT ● BLOB ● Datatypes In SQLite Version 3 http://www.sqlite.org/datatype3.html
  • 8.
    まずは使ってみよう ● コマンドラインシェルで SQLite を体験 ● コンソールから「sqlite3 データベース名」 と入力
  • 9.
    例 C:docnsegsqlite>sqlite3 hoge.db SQLite version3.7.13 2012-06-11 02:05:22 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> CREATE TABLE test ( ...> id INTEGER PRIMARY KEY NOT NULL, ...> name TEXT NOT NULL DEFAULT ''); sqlite> INSERT INTO test (id, name) ...> VALUES (1, 'Foo Bar'); sqlite> INSERT INTO test (id, name) ...> VALUES (2, 'Hoge Fuga'); sqlite> SELECT * FROM test; 1|Foo Bar 2|Hoge Fuga sqlite> .q C:docnsegsqlite>
  • 10.
    PHP から SQLiteを使う ● php.ini で ;extension=php_pdo_sqlite.dll の行を有効にすると、PDO で SQLite が 使えるようになる
  • 11.
    <?php // 接続 if (!$db= new PDO("sqlite:test.db")) { die("DB connection failed."); } // CREATE TABLE $sql = <<< __EOHD CREATE TABLE Test ( id INTEGER PRIMARY KEY NOT NULL, name TEXT NOT NULL DEFAULT '' ); __EOHD; if (!$db->query($sql)) { die("Create table failed."); }
  • 12.
    // INSERT $stmt =$db->prepare("INSERT INTO test(id, name) " . "VALUES (:id, :name)"); $arg = array(':id' => 1, ':name' => "Foo Bar"); if (!$stmt->execute($arg)) { echo "Insert failed."; } $arg = array(':id' => 2, ':name' => "Hoge Fuga"); if (!$stmt->execute($arg)) { echo "Insert failed."; } // SELECT $stmt = $db->prepare("SELECT * FROM Test ORDER BY id"); $stmt->execute(); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $id = $row['id']; $name = $row['name']; echo "id: $id, name: $namen"; }
  • 13.
    INSERT 時の注意 ● 大量の行を INSERT する場合は、必ず トランザクションで挟むこと! ● さもないと、ものすごく時間が掛かる
  • 14.
    ⼤量 INSERT の例 <?php //接続 $db = new PDO("sqlite:trans.db"); // CREATE TABLE $sql = <<< __EOHD CREATE TABLE Test ( id INTEGER PRIMARY KEY NOT NULL, value INTEGER NOT NULL ); __EOHD; $db->query($sql); // 開始時刻 $start_time = microtime(true) * 1000; // ミリ秒
  • 15.
    // トランザクション開始 $db->beginTransaction(); // 1,000件 INSERT $stmt = $db->prepare("INSERT INTO test(id, value) " . "VALUES (:id, :value)"); for ($i = 1; $i <= 1000; ++$i) { $arg = array(':id' => $i, ':value' => mt_rand()); $stmt->execute($arg); } // トランザクション終了 $db->commit(); // 終了時刻 $end_time = microtime(true) * 1000; // ミリ秒 echo ($end_time - $start_time) . "ms elapsed.n";
  • 16.
    実際にやってみると…… ● トランザクションあり → 0.028 秒 ● トランザクションなし → 7.232 秒 INSERT 時には トランザクションを 忘れずに!!
  • 17.
    【特集】生まれ変わるPHP - ZendEngine 2、SQLiteの実力は? (8) MySQLとSQLiteの比較 - 大量のデータの書込みでは? http://news.mynavi.jp/special/2004/php5/007.html このスクリプトは、両者とも全く同じく1000件の データを連続して挿入する。実行結果は、予想外に 圧倒的な大差がついた。 (SQLite = 16.4 秒、MySQL = 0.4 秒) さすがはMySQLといったところだが、SQLiteの16秒は ちょっとかかりすぎだろう。どうやら大量データの連続 挿入はSQLiteの不得意な処理のようだ。 ※「お詫びと訂正」が追記されています
  • 18.
  • 19.
    おしまい。 suno (すの) Inspired by @tmtms suno88