SQLiteのインメモリDBを異なるPDOオブジェクトから参照するには
どうにもSQLiteのインメモリDBの値が取得できなかったので、実験してみました。
いきなり結論を書くと、「あるPDOオブジェクトからは、別のPDOオブジェクトが作成したインメモリDBには接続できない」ようです。
テストコード
<?php
/**
* SQLiteのオンメモリDBにテストデータを作成し、PDOからアクセスできることを確かめる
*/
try {
$pdo1 = new PDO('sqlite::memory:', null, null);
$pdo1->exec('CREATE TABLE uso(id INTEGER PRIMARY KEY, name STRING)');
$pdo1->exec('INSERT INTO uso VALUES (1, "uhouho");');
$pdo1->exec('INSERT INTO uso VALUES (2, "mojamoja");');
// 接続済みのPDOオブジェクトからデータを取得できるか試してみる
$stmt = $pdo1->query('SELECT * FROM uso');
if (!$stmt) {
echo 'Cannot fetch data via $pdo1.';
} else {
print_r($stmt->fetchAll(PDO::FETCH_ASSOC));
}
// 新たにPDOオブジェクトを作成し、データを取得できるか試してみる
$pdo2 = new PDO('sqlite::memory:');
$stmt = $pdo2->query('SELECT * FROM uso');
if (!$stmt) {
echo 'Cannot fetch data via $pdo2.';
} else {
print_r($stmt->fetchAll(PDO::FETCH_ASSOC));
}
} catch (Exception $e) {
exit($e->getMessage());
}
結果
Array
(
[0] => Array
(
[id] => 1
[name] => uhouho
)
[1] => Array
(
[id] => 2
[name] => mojamoja
)
)
Cannot fetch data via $pdo2.
$pdo1で作成したインメモリDBに、$pdo2からは接続できていません。
どちらも同じ「sqlite::memory:」ですが、見ている領域は異なるようです。
考察
インメモリDB内に作ったテーブルに、複数のPDOオブジェクトからアクセスすることはできませんでした。
アクセスしたければ、テーブルを作ったPDOオブジェクトを使い回すしかなさそうです。