1

谁能解释一下 sqlite::memory 是如何工作的?据我了解,它仅适用于每个实例,因此您不能例如使用 PDO 的一个实例创建数据库模式并通过另一个 PDO 实例使用 sqlite::memory 填充刚刚创建的表?您只需将 PDO 实例作为参数传递或使其成为全局变量?

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

$模式=<<<SQL
创建表“用户”(
“id”整数主键自动增量不为空,
“用户名” VARCHAR UNIQUE NOT NULL,
“电子邮件” VARCHAR UNIQUE NOT NULL,
“代码” VARCHAR
);
SQL;

$dsn = 'sqlite::memory:';

//实例1
$db1 = 新 PDO($dsn);
$db1->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db1->exec($schema);

$db1->执行(
     “插入用户(用户名,电子邮件)
     VALUES('John Doe', 'user@example.com');"
 );

$statement1 = $db1->prepare('SELECT * FROM Users WHERE email =:email;');
var_dump($statement1); 回声 PHP_EOL; //对象(PDOStatement)....

//instance2 访问 inst1 内存 db 失败
$db2 = 新 PDO($dsn); //还有内存数据库
$db2->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$statement2 = $db2->prepare('SELECT * FROM Users WHERE email =:email;');
var_dump($statement2); 回声 PHP_EOL; //PDOException',带有消息'SQLSTATE [HY000]:一般错误:1没有这样的表:用户......
4

1 回答 1

2

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

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

于 2013-09-16T06:52:07.223 回答