2

私の PHP ユニット テストでは、次のテーブルを含む SQLite インメモリ データベースを使用しています。

CREATE TABLE "battlegroup_request" (
  "id" INTEGER NULL PRIMARY KEY AUTOINCREMENT,
  "battlegroupID" INTEGER NULL,
  "inviterID" INTEGER NULL,
  "inviteeID" INTEGER NULL
)

2 つの整数バインディングを使用して次のクエリを実行すると、

SELECT *
FROM "battlegroup_request"
WHERE "inviteeid" = ? AND
  "inviter" IS NOT NULL AND
  "battlegroupid" = ?
LIMIT 1

inviterクエリは 1 つの結果を返しますが、列が存在しないため、エラーがスローされると予想されます。これは SQLite の予想される動作ですか? 私は何か間違ったことをしていますか?

私は PDO を使用しています。接続は次のように作成されました。

new PDO(
    'sqlite::memory:',
    null,
    null,
    array(
        PDO::ATTR_CASE => PDO::CASE_LOWER,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
        PDO::ATTR_STRINGIFY_FETCHES => false,
        PDO::ATTR_EMULATE_PREPARES => false,
    )
);

(これらのオプションは、使用しているフレームワークであるLaravelのデフォルトです。)

4

1 に答える 1

4

次のようなものを使用する場合:

SELECT "inviter" IS NOT NULL FROM battlegroup_request

SQLiteは単なる文字列値としてinviter扱われるため、列が存在しなかった場合はTRUEを返します(確かにここにはありません)。"inviter"NULL

ただし、二重引用符を削除した場合:

SELECT inviter IS NOT NULL FROM battlegroup_request

inviter列が存在しなかった場合は例外が発生します。

編集:バッククォートを使用すると、SQLiteはそれを(文字列ではなく)名前として扱うように強制されます:

SELECT `inviter` IS NOT NULL FROM battlegroup_request

inviter列が存在しなかった場合は例外が発生します。

于 2012-12-18T10:53:05.050 に答える