私は、基本的な ORM と DBAL のサポートを単なる学習レッスンとして提供する、独自の PHP モデル システムを作成してきました。これまでにやったことがないことを書いたり、使ったことのない SQLite や PostgreSQL などのデータベースを使用したりできました。
モデル パッケージ: https://github.com/titon/Model PgSQL パッケージ: https://github.com/titon/Model.PostgreSQL
私が抱えている問題は、PgSQL ドライバーの単体テストです (MySQL と SQLite が動作しています)。単体テストが実行されるたびに、次のエラーが表示されます。
PDOException : SQLSTATE[55000]: Object not in prerequisite state: 7 ERROR: currval of sequence "users_id_seq" is not yet defined in this session
この問題が何であるかはわかっていますが、何も解決していないようです。単体テストにも到達しません。フィクスチャのセットアップ部分で失敗します。各単体テスト中に実行される手順は次のとおりです。
- ドライバーは初期化され、接続されます
setUp()
- 単体テストメソッドが呼び出されます
- フィクスチャが読み込まれます
- CREATE TABLE ステートメントが呼び出されます
- CREATE INDEX ステートメントが呼び出される
- INSERT レコードが呼び出されます
- 単体テストが実行されます
tearDown()
フィクスチャ (DROP TABLE および INDEX) をアンロードし、ドライバを切断します。
ステップ 3.3 でフィクスチャ レコードの挿入中にエラーが発生します。1 番目のレコード (10 件中) を挿入し、最後の挿入 ID をフェッチしようとして失敗します (上記のシーケンス エラー)。PGAdmin を確認すると、テーブルとシーケンスが存在するため、混乱しています。
- 挿入が呼び出されるまでに、シーケンスはまだ完全に作成されていませんか?
- 接続セッションの終了が早すぎますか?
- どうすればこれを解決できますか?
私はPgSQLを初めて使用するので、助けていただければ幸いです。記録として、コードは PHP PDO を使用しており、lastInsertId('table_column_seq') を呼び出して最後の ID を取得しています。
興味がある場合は、フィクスチャ setUp SQL を参照してください。
CREATE TABLE IF NOT EXISTS "users" (
"id" serial NOT NULL,
"country_id" integer NULL DEFAULT NULL,
"username" varchar(255) NULL,
"password" varchar(255) NULL,
"email" varchar(255) NULL,
"firstName" varchar(255) NULL,
"lastName" varchar(255) NULL,
"age" smallint NULL,
"created" timestamp NULL DEFAULT NULL,
"modified" timestamp NULL DEFAULT NULL,
UNIQUE ("username")
);
CREATE INDEX "country_id" ON "users" ("country_id");
INSERT INTO "users" ("id", "country_id", "username", "firstName", "lastName", "password", "email", "age", "created") VALUES ('1', 1, 'miles', 'Miles', 'Johnson', '1Z5895jf72yL77h', 'miles@email.com', 25, '1988-02-26 21:22:34');
# Fails right after this insert