thinkphp5兼容PostgreSql的model操作

1、簡單說明

  • 舊的項目使用的 ThinkPHP 5.0 ;
  • Model配置PostgreSql會出現各種報錯;

model一般配置
class Demo extends Model { protected $connection = 'pgsql'; protected $table = 'xxx.xxx'; }

2、兼容性修改

1)在pgsql庫上運行sql文件(thinkphp/library/think/db/connector/pgsql.sql)

主要爲了創建幾個自定義函數( "public"."table_msg"),框架運行需要用到;

對於 PostgreSql11 以上版本會報錯,某些字段已經廢棄掉了,需要如下修改:

找到這行: pg_attrdef.adsrc AS fields_default
改成:pg_get_expr(pg_attrdef.adbin, pg_attrdef.adrelid) AS fields_default

運行成功後會有兩個重載函數(第一個默認schema=public):

  • "public"."table_msg" (a_table_name varchar)
  • "public"."table_msg"(a_schema_name varchar, a_table_name varchar)

2)修改connector文件(thinkphp/library/think/db/connector/Pgsql.php)

主要針對方法:getFields($tableName) 需要用到上面創建的函數進行獲取字段類型等;

找到這2行,可以看出,無論怎麼配置表名,都會使用上門第一個重載方法(默認schema=public)
list($tableName) = explode(' ', $tableName);

$sql = 'select fields_name as "field",fields_type as "type",fields_not_null as "null",fields_key_name as "key",fields_default as "default",fields_default as "extra" from table_msg(\'' . $tableName . '\');';

需要進行兼容改造,支持配置:xxx.xxx 的表名(schema_name+table_name)
list($schemeName, $tableName) = explode('.', $tableName);

$sql = 'select fields_name as "field",fields_type as "type",fields_not_null as "null",fields_key_name as "key",fields_default as "default",fields_default as "extra" from table_msg(\'' . $schemeName . '\',\'' . $tableName . '\');';

3) 兼容 pg connector 的 getLastInsID 方法

由於pg表的不一定都有自增字段,當調用 $mod->insert() /save() 等方法就會異常退出(因爲該表沒有sequence 類型字段)

源碼:

源碼:$this->connection->getLastInsID($sequence)
所以需要在此文件(thinkphp/library/think/db/connector/Pgsql.php)重寫方法 getLastInsID(),增加try-catch 處理即可
try { return parent::getLastInsID($sequence); } catch (\Exception $e) { return null; }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章