是否可以将 CakePHP 与 Oracle 作为数据库一起使用?

问题描述 投票:0回答:1

我正在尝试在 CakePHP 4 项目上从 MySQL 切换到 Oracle 数据库,这似乎是不可能的。 我正在使用这个驱动程序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: invalid character

找谁报错:

$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 cakephp pdo driver oracle-cloud-infrastructure
1个回答
0
投票

错误产生自:

 (ROWNUM) AS _cake_page_rownum_

应该是:

 (ROWNUM) AS "_cake_page_rownum_"

因为

_
不是不带引号的标识符的有效前导字符。

ORM 通常会在它们生成的整个代码中使用带引号的标识符;您的代码(有一个例外)没有使用任何看起来很奇怪的带引号的标识符。

© www.soinside.com 2019 - 2024. All rights reserved.