问题描述:
一个老项目一直在运行,前几天手痒,维护时更新了thinkphp的ORM
组件。当时运行一切正常,今天客户反馈不能自动同步主数据库了。打开调试发现问题如下:
[备注:ThinkPHP版本:v6.0.13LTS]
[2022-10-18T22:08:51+08:00][sql] select a.column_name,data_type,DECODE (nullable, 'Y', 0, 1) notnull,data_default, DECODE (A .column_name,b.column_name,1,0) pk from all_tab_columns a,(select column_name from all_constraints c, all_cons_columns col where c.constraint_name = col.constraint_name and c.constraint_type = 'X' and c.table_name = 'X_aaabbb_eee' ) b where table_name = 'X_aaabbb_eee' and a.column_name = b.column_name (+) [ RunTime:0.000735s ]
[2022-10-18T22:08:51+08:00][error] [10501]SQLSTATE[HY000]: General error: 942 OCIStmtExecute: ORA-00942: table or view does not exist
(ext\pdo_oci\oci_statement.c:157)[X:\XXX\vendor\topthink\think-orm\src\db\PDOConnection.php:797]
General error: 942 OCIStmtExecute: ORA-00942:这个错误一般是数据库表名错误。
网上错误解决方案:
'params' => [ \PDO::ATTR_CASE => \PDO::CASE_LOWER, ],
这个设置是控制表列名的,并不是控制数据库表名的。
网上比较麻烦的解决方案:
- 一种是直接修改thinkphp源代码,使表名大小写转换失效。【不更新版本会一直生效】
- 一种是在自己的模型类里设置覆盖全局变量:表名。【更新版本,变量名可能被修改】
正确的解决方案:
class X_aaabbb_eee extends Model
{
protected $connection = 'oracle';
protected $table = 'X_AAABBB_EEE'; //这里填写完整的数据库表名,区分大小写。
}