初心者向け SQLite の始め方

4,607 views

Published on

「NSEG 第 28 回勉強会 Feat. 高専カンファレンス」(2012/6/23)の LT スライドを一部改変したものです。

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,607
On SlideShare
0
From Embeds
0
Number of Embeds
121
Actions
Shares
0
Downloads
10
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

初心者向け SQLite の始め方

  1. 1. 初心者向け SQLite の始め方 SQLite Beginners Talk suno (すの) 2012-06-23初心者向け SQLite の始め方 - SQLite Beginners Talk Powered by LibreOffice Impress 3.5.4.2
  2. 2. 自己紹介● 春原 宏保 (すのはら ひろやす● プログラマー (Win32、Web) ● 長野市内の SIer 勤務 ● Delphi、PHP、C#、 C++、Java、 JavaScript...
  3. 3. 今日のお題は── 軽量データベースエンジン SQLite
  4. 4. SQLite とは● ファイルベースの RDBMS● ユーザー権限とか、面倒な話は一切なし● 小さくて軽い! ● Windows 版 sqlite3.dll (Version 3.7.13) 599,419 バイト● 高い信頼性 ● バージョンアップして後悔した経験皆無(※) (※) 個人の感想です
  5. 5. 高い信頼性● SQLiteのテストコードは4567万8000行! 本 体のコードは6万7000行 http://www.publickey1.jp/blog/10/sqlite45678000_67000.html
  6. 6. 困ったら公式サイトへ● 公式サイト http://www.sqlite.org/● 公式 Wiki http://www.sqlite.org/cvstrac/wiki
  7. 7. SQLite のデータ型● 以下の 5 つしかない ● NULL ● INTEGER ● REAL ● TEXT ● BLOB● Datatypes In SQLite Version 3 http://www.sqlite.org/datatype3.html
  8. 8. まずは使ってみよう● コマンドラインシェルで SQLite を体験● コンソールから「sqlite3 データベース名」 と入力
  9. 9. 例C:docnsegsqlite>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> .qC:docnsegsqlite>
  10. 10. PHP から SQLite を使う● php.ini で ;extension=php_pdo_sqlite.dll の行を有効にすると、PDO で SQLite が 使えるようになる
  11. 11. <?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.");}
  12. 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. 13. INSERT 時の注意● 大量の行を INSERT する場合は、必ず トランザクションで挟むこと! ● さもないと、ものすごく時間が掛かる
  14. 14. ⼤量 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; // ミリ秒
  15. 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. 16. 実際にやってみると……● トランザクションあり → 0.028 秒● トランザクションなし → 7.232 秒 INSERT 時には トランザクションを 忘れずに!!
  17. 17. 【特集】生まれ変わるPHP - Zend Engine2、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. 18. かわいいよ SQLiteかわいいよ
  19. 19. おしまい。 suno (すの)Inspired by @tmtms suno88

×