有人能解释一下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 ....
答案 0 :(得分:2)
如您的代码所示,每个new PDO('sqlite::memory:')
调用都会创建一个新的独立内存数据库。
我不知道那本书是做什么的,但是如果你想重新使用内存数据库,你必须确保测试设置和你的实际代码共享相同的数据库连接。