初心者向け sqlite の始め方
DESCRIPTION
「NSEG 第 28 回勉強会 Feat. 高専カンファレンス」(2012/6/23)の LT スライドを一部改変したものです。TRANSCRIPT
初心者向け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 3http://www.sqlite.org/datatype3.html
まずは使ってみよう● コマンドラインシェルで SQLite を体験
● コンソールから「sqlite3 データベース名」と入力
例C:\doc\nseg\sqlite>sqlite3 hoge.dbSQLite version 3.7.13 2012-06-11 02:05:22Enter ".help" for instructionsEnter 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 Bar2|Hoge Fugasqlite> .q
C:\doc\nseg\sqlite>
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 = <<< __EOHDCREATE 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: $name\n";}
INSERT 時の注意● 大量の行を INSERT する場合は、必ず
トランザクションで挟むこと!
● さもないと、ものすごく時間が掛かる
⼤量 INSERT の例<?php// 接続$db = new PDO("sqlite:trans.db");
// CREATE TABLE$sql = <<< __EOHDCREATE 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 (すの)
suno88Inspired by @tmtms