SlideShare a Scribd company logo
初心者向け
                                   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

More Related Content

What's hot

My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1
Makoto Haruyama
 
Mysql casual fukuoa_vlo_2
Mysql casual fukuoa_vlo_2Mysql casual fukuoa_vlo_2
Mysql casual fukuoa_vlo_2
Makoto Haruyama
 
MySQLステータスモニタリング
MySQLステータスモニタリングMySQLステータスモニタリング
MySQLステータスモニタリング
yoku0825
 

What's hot (20)

わかった気になるMySQL
わかった気になるMySQLわかった気になるMySQL
わかった気になるMySQL
 
My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
 
MySQL 5.7の次のMySQLは
MySQL 5.7の次のMySQLはMySQL 5.7の次のMySQLは
MySQL 5.7の次のMySQLは
 
Mysql toranomaki
Mysql toranomakiMysql toranomaki
Mysql toranomaki
 
わたしを支える技術
わたしを支える技術わたしを支える技術
わたしを支える技術
 
MySQL 5.7の次のMySQL 8.0はどんなものになるだろう
MySQL 5.7の次のMySQL 8.0はどんなものになるだろうMySQL 5.7の次のMySQL 8.0はどんなものになるだろう
MySQL 5.7の次のMySQL 8.0はどんなものになるだろう
 
今から備えるMySQL最新バージョン5.7
今から備えるMySQL最新バージョン5.7今から備えるMySQL最新バージョン5.7
今から備えるMySQL最新バージョン5.7
 
Migr8.rb チュートリアル
Migr8.rb チュートリアルMigr8.rb チュートリアル
Migr8.rb チュートリアル
 
光のMySQL 5.7
光のMySQL 5.7光のMySQL 5.7
光のMySQL 5.7
 
Mysql casual fukuoa_vlo_2
Mysql casual fukuoa_vlo_2Mysql casual fukuoa_vlo_2
Mysql casual fukuoa_vlo_2
 
進化したのはサーバだけじゃない!〜DBA の毎日をもっと豊かにするユーティリティのすすめ〜
進化したのはサーバだけじゃない!〜DBA の毎日をもっと豊かにするユーティリティのすすめ〜進化したのはサーバだけじゃない!〜DBA の毎日をもっと豊かにするユーティリティのすすめ〜
進化したのはサーバだけじゃない!〜DBA の毎日をもっと豊かにするユーティリティのすすめ〜
 
MySQLステータスモニタリング
MySQLステータスモニタリングMySQLステータスモニタリング
MySQLステータスモニタリング
 
Performance Schema @ MySQL Casual #2
Performance Schema @ MySQL Casual #2Performance Schema @ MySQL Casual #2
Performance Schema @ MySQL Casual #2
 
Sql world を支える技術
Sql world を支える技術Sql world を支える技術
Sql world を支える技術
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
Devsの常識、DBAは非常識
Devsの常識、DBAは非常識Devsの常識、DBAは非常識
Devsの常識、DBAは非常識
 
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
 
オープンソースでExcelレポートプログラミング
オープンソースでExcelレポートプログラミングオープンソースでExcelレポートプログラミング
オープンソースでExcelレポートプログラミング
 
プロキシーを使ってテストを楽にする
プロキシーを使ってテストを楽にするプロキシーを使ってテストを楽にする
プロキシーを使ってテストを楽にする
 

Similar to 初心者向け SQLite の始め方

PerlとSQLのいろいろ
PerlとSQLのいろいろPerlとSQLのいろいろ
PerlとSQLのいろいろ
Takuya Tsuchida
 
Seas で語られたこととは?
Seas で語られたこととは?Seas で語られたこととは?
Seas で語られたこととは?
Masayuki Ozawa
 
Sql server よく聞く設定とその効果
Sql server よく聞く設定とその効果Sql server よく聞く設定とその効果
Sql server よく聞く設定とその効果
Masayuki Ozawa
 
Let s database_testing
Let s database_testingLet s database_testing
Let s database_testing
Yuji Shimada
 
Handlersocket 20110517
Handlersocket 20110517Handlersocket 20110517
Handlersocket 20110517
akirahiguchi
 
Google App Engine for Java
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for Java
Takuya Tsuchida
 
SugarCRM meets Azure
SugarCRM meets AzureSugarCRM meets Azure
SugarCRM meets Azure
Toshiya TSURU
 
PhpでMySqlを使う
PhpでMySqlを使うPhpでMySqlを使う
PhpでMySqlを使う
pcod
 

Similar to 初心者向け SQLite の始め方 (20)

猫でもわかるかもしれない SQLインジェクション
猫でもわかるかもしれない SQLインジェクション猫でもわかるかもしれない SQLインジェクション
猫でもわかるかもしれない SQLインジェクション
 
PerlとSQLのいろいろ
PerlとSQLのいろいろPerlとSQLのいろいろ
PerlとSQLのいろいろ
 
Start SQL Server with Docker
Start SQL Server with DockerStart SQL Server with Docker
Start SQL Server with Docker
 
Seas で語られたこととは?
Seas で語られたこととは?Seas で語られたこととは?
Seas で語られたこととは?
 
swooleを試してみた
swooleを試してみたswooleを試してみた
swooleを試してみた
 
Sql server よく聞く設定とその効果
Sql server よく聞く設定とその効果Sql server よく聞く設定とその効果
Sql server よく聞く設定とその効果
 
scala-kaigi1-sbt
scala-kaigi1-sbtscala-kaigi1-sbt
scala-kaigi1-sbt
 
System2
System2System2
System2
 
Let s database_testing
Let s database_testingLet s database_testing
Let s database_testing
 
FMDBの利用方法
FMDBの利用方法FMDBの利用方法
FMDBの利用方法
 
Handlersocket 20110517
Handlersocket 20110517Handlersocket 20110517
Handlersocket 20110517
 
Google App Engine for Java
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for Java
 
ScalaMatsuri 2016
ScalaMatsuri 2016ScalaMatsuri 2016
ScalaMatsuri 2016
 
SQLite2と3のエスケープ関数の違いとその対策
SQLite2と3のエスケープ関数の違いとその対策SQLite2と3のエスケープ関数の違いとその対策
SQLite2と3のエスケープ関数の違いとその対策
 
Cocoa勉強会#6-SQLiteをCocoaで使う
Cocoa勉強会#6-SQLiteをCocoaで使うCocoa勉強会#6-SQLiteをCocoaで使う
Cocoa勉強会#6-SQLiteをCocoaで使う
 
SugarCRM meets Azure
SugarCRM meets AzureSugarCRM meets Azure
SugarCRM meets Azure
 
What is doobie? - database access for scala -
What is doobie? - database access for scala -What is doobie? - database access for scala -
What is doobie? - database access for scala -
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
 
VerilatorとSystemC
VerilatorとSystemCVerilatorとSystemC
VerilatorとSystemC
 
PhpでMySqlを使う
PhpでMySqlを使うPhpでMySqlを使う
PhpでMySqlを使う
 

More from suno88

8bit 時代のプログラミング事情を訪ねて
8bit 時代のプログラミング事情を訪ねて8bit 時代のプログラミング事情を訪ねて
8bit 時代のプログラミング事情を訪ねて
suno88
 
ITでみんなを幸せに、ITで自分も幸せに
ITでみんなを幸せに、ITで自分も幸せにITでみんなを幸せに、ITで自分も幸せに
ITでみんなを幸せに、ITで自分も幸せに
suno88
 

More from suno88 (16)

もうひとつのアンチパターン OTLT、あるいは如何にして私はオレオレフレームワークを忌み嫌うようになったか
もうひとつのアンチパターン OTLT、あるいは如何にして私はオレオレフレームワークを忌み嫌うようになったかもうひとつのアンチパターン OTLT、あるいは如何にして私はオレオレフレームワークを忌み嫌うようになったか
もうひとつのアンチパターン OTLT、あるいは如何にして私はオレオレフレームワークを忌み嫌うようになったか
 
NSEG のこれまでとこれから
NSEG のこれまでとこれからNSEG のこれまでとこれから
NSEG のこれまでとこれから
 
AWS で社内オンライン勉強会
AWS で社内オンライン勉強会AWS で社内オンライン勉強会
AWS で社内オンライン勉強会
 
NetBeans、FuelPHP と過ごしたこの 2 ヶ月
NetBeans、FuelPHP と過ごしたこの 2 ヶ月NetBeans、FuelPHP と過ごしたこの 2 ヶ月
NetBeans、FuelPHP と過ごしたこの 2 ヶ月
 
HTML と CSS の社内勉強会を主催した話
HTML と CSS の社内勉強会を主催した話HTML と CSS の社内勉強会を主催した話
HTML と CSS の社内勉強会を主催した話
 
Javascript で暗号化
Javascript で暗号化Javascript で暗号化
Javascript で暗号化
 
NSEG 勉強会 二周年に寄せて
NSEG 勉強会 二周年に寄せてNSEG 勉強会 二周年に寄せて
NSEG 勉強会 二周年に寄せて
 
続・ねえ、お父さんのお仕事ってなぁに?
続・ねえ、お父さんのお仕事ってなぁに?続・ねえ、お父さんのお仕事ってなぁに?
続・ねえ、お父さんのお仕事ってなぁに?
 
ねえ、お父さんのお仕事ってなぁに?
ねえ、お父さんのお仕事ってなぁに?ねえ、お父さんのお仕事ってなぁに?
ねえ、お父さんのお仕事ってなぁに?
 
Windows azure
Windows azureWindows azure
Windows azure
 
Cloud
CloudCloud
Cloud
 
「交通勉強会 ~Trafficonf ~」発足に寄せて
「交通勉強会 ~Trafficonf ~」発足に寄せて「交通勉強会 ~Trafficonf ~」発足に寄せて
「交通勉強会 ~Trafficonf ~」発足に寄せて
 
ソフトウェアエンジニアに必要な法律・契約のお話
ソフトウェアエンジニアに必要な法律・契約のお話ソフトウェアエンジニアに必要な法律・契約のお話
ソフトウェアエンジニアに必要な法律・契約のお話
 
8bit 時代のプログラミング事情を訪ねて
8bit 時代のプログラミング事情を訪ねて8bit 時代のプログラミング事情を訪ねて
8bit 時代のプログラミング事情を訪ねて
 
山椒は小粒でぴりりと辛い
山椒は小粒でぴりりと辛い山椒は小粒でぴりりと辛い
山椒は小粒でぴりりと辛い
 
ITでみんなを幸せに、ITで自分も幸せに
ITでみんなを幸せに、ITで自分も幸せにITでみんなを幸せに、ITで自分も幸せに
ITでみんなを幸せに、ITで自分も幸せに
 

Recently uploaded

2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
ssuserbefd24
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 

Recently uploaded (14)

FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 

初心者向け 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 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>
  • 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 - 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の不得意な処理のようだ。 ※「お詫びと訂正」が追記されています
  • 19. おしまい。 suno (すの) Inspired by @tmtms suno88