pdo sqlite :: memory:共享和生命

时间:2013-09-15 16:22:13

标签: sqlite pdo in-memory-database

有人能解释一下sqlite :: memory是如何工作的吗?据我所知它只适用于每个实例,所以你不能使用PDO的一个实例创建数据库模式,并通过另一个带有sqlite :: memory的PDO实例填充刚刚创建的表? 您只需将PDO实例作为参数传递或将其设为全局?

我为什么要问,这是因为我正在读一本关于单元测试的书,在一个例子中,他们用表用户创建一个内存数据库并用一条记录填充它,这是用phpUnit setUp()方法完成的,表的读取由PDO的另一个实例完成,该实例是在必须测试的实际代码中创建的。 对我来说,PDO内存db的每个实例都拥有它自己独立的数据库似乎是合乎逻辑的,但也许我错过了一些东西。 非常感谢您的意见,谢谢。

$schema =<<<SQL
CREATE TABLE "Users" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"username" VARCHAR UNIQUE NOT NULL,
"email" VARCHAR UNIQUE NOT NULL,
"code" VARCHAR
);
SQL;

$dsn = 'sqlite::memory:';

//instance1
$db1 = new PDO($dsn);
$db1->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db1->exec($schema);

$db1->exec(
     "INSERT INTO Users(username, email)
     VALUES('John Doe', 'user@example . com');"
 );

$statement1 = $db1->prepare('SELECT * FROM Users WHERE email =:email;');
var_dump($statement1); echo PHP_EOL; //object(PDOStatement)....

//instance2 tring to access inst1 memory db and fails
$db2 = new PDO($dsn); //also memory db
$db2->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$statement2 = $db2->prepare('SELECT * FROM Users WHERE email =:email;');
var_dump($statement2); echo PHP_EOL; //PDOException' with message 'SQLSTATE[HY000]: General error: 1 no such table: Users ....

1 个答案:

答案 0 :(得分:2)

如您的代码所示,每个new PDO('sqlite::memory:')调用都会创建一个新的独立内存数据库。

我不知道那本书是做什么的,但是如果你想重新使用内存数据库,你必须确保测试设置和你的实际代码共享相同的数据库连接。