1

sqlite::memory の仕組みを説明してくれる人はいますか? 私が理解したように、インスタンスごとにのみ機能するため、たとえば、PDO の 1 つのインスタンスを使用して db スキーマを作成し、作成したばかりのテーブルを別の PDO インスタンスを介して sqlite::memory で埋めることはできませんか? PDOインスタンスをparamとして渡すか、グローバルにするだけですか?

なぜ私が尋ねているのですか、それはユニットテストに関する本を読んでいて、例の1つでは、テーブルUsersでメモリデータベースを作成し、1つのレコードで埋めているからです。これはphpUnit setUp()メソッドで行われ、テーブルは、テストする必要がある実際のコードで作成された PDO の別のインスタンスによって行われます。PDO メモリ db の各インスタンスに独自の個別の db があることは論理的に思えますが、何か不足している可能性があります。ご意見をいただければ幸いです。

$schema =<<<SQL
CREATE TABLE "ユーザー" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
「ユーザー名」 VARCHAR UNIQUE NOT NULL,
"email" 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->exec(
     "INSERT INTO ユーザー(ユーザー名、メールアドレス)
     VALUES('John Doe', 'user@example .com');"
 );

$statement1 = $db1->prepare('SELECT * FROM Users WHERE email =:email;');
var_dump($文1); PHP_EOL をエコーし​​ます。//object(PDOStatement)....

//instance2 が inst1 メモリ データベースにアクセスしようとして失敗する
$db2 = 新しい PDO($dsn); //メモリデータベースも
$db2->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$statement2 = $db2->prepare('SELECT * FROM Users WHERE email =:email;');
var_dump($文2); PHP_EOL をエコーし​​ます。//PDOException' とメッセージ 'SQLSTATE[HY000]: 一般エラー: 1 そのようなテーブルはありません: ユーザー ....
4

1 に答える 1

2

コードで示されているように、new PDO('sqlite::memory:')呼び出しごとに新しい独立したメモリ内データベースが作成されます。

その本の内容はわかりませんが、メモリ内データベースを再利用したい場合は、テストのセットアップと実際のコードが同じデータベース接続を共有していることを確認する必要があります。

于 2013-09-16T06:52:07.223 に答える