Можно ли использовать CakePHP с Oracle в качестве базы данных?

Я пытаюсь переключиться с MySQL на базу данных Oracle в проекте CakePHP 4, и это кажется невозможным. Я использую этот драйвер CakePHP Oracle Driver и установил InstantCliente 19.6, oci8-2.2.0 (для php7.4.33) и pdo_oci, как это описано в репозитории.

Я могу заставить работать только запрос, созданный вручную, как этот:

$sql = $this->oracleConnection
            ->newQuery()
            ->select('USERS.LOCKED, USERS.LOCK_TYPE')
            ->from('USERS')
            ->where('USERS.USERNAME = \'' . $username . '\' AND ROWNUM = 1')
            ->order([]);

Но методы CakePHP по умолчанию, такие как find() и get(), выдают такие ошибки: ORA-00911: недопустимый символ.

Найдите, кто выдает ошибку:

$blockedUser = $this->blockedUser->find('all', [
            'conditions' => [
                'BlockedUsers.blocked_until >' => FrozenTime::now(),
                'BlockedUsers.username' => $username,
            ],
        ])->first();

И запрос, который он отправляет и получает ошибку:

SELECT *
FROM (
  SELECT cake_paging.*, (ROWNUM) AS _cake_page_rownum_
  FROM (
    SELECT BlockedUsers.ID AS BlockedUsers__ID,
           BlockedUsers.USERNAME AS BlockedUsers__USERNAME,
           BlockedUsers.OS AS BlockedUsers__OS,
           BlockedUsers.USER_AGENT AS BlockedUsers__USER_AGENT, 
           BlockedUsers.CREATED AS BlockedUsers__CREATED,
           BlockedUsers.BLOCKED_UNTIL AS BlockedUsers__BLOCKED_UNTIL
    FROM   blocked_users BlockedUsers
    WHERE (BlockedUsers.blocked_until > :c0 AND BlockedUsers.username = :c1)
  ) cake_paging
) cake_paging_out
WHERE cake_paging_out."_cake_page_rownum_" <= 1

И ТАБЛИЦА BLOCKED_USERS:

BLOCKED_USERS

Также здесь мое подключение из app.php:

'default' => [
            'className' => 'CakeDC\OracleDriver\Database\OracleConnection',
            'driver' => 'CakeDC\OracleDriver\Database\Driver\OracleOCI',
            'persistent' => false,
            'host' => 'myhost',
            'port' => 'myport',
            'username' => 'myusername',
            'password' => 'mypassword',
            'database' => 'myDB',
            'sid' => 'mySID',
            'encoding' => 'WE8ISO8859P1',
            'timezone' => '+1:00',
            'flags' => [],
            'cacheMetadata' => true,
            'log' => false,
            'quoteIdentifiers' => false,
            'server_version' => 10,
            'url' => env('DATABASE_URL', null),
        ],

Я уже пытался протестировать несколько типов соединений в app.php, удалить и установить php и расширения. При всем этом я спрашиваю себя, делаю ли я что-то не так или это не возможно?

🤔 А знаете ли вы, что...
Oracle Database предоставляет средства для создания и управления реляционными и пространственными индексами.


70
1

Ответ:

Решено

Ошибка генерируется из:

 (ROWNUM) AS _cake_page_rownum_

Должен быть:

 (ROWNUM) AS "_cake_page_rownum_"

поскольку _ не является допустимым ведущим символом для идентификатора без кавычек.

ORM обычно используют идентификаторы в кавычках во всем коде, который они генерируют; ваш код (за одним исключением) не использует идентификаторы в кавычках, что выглядит странно.