2025-04-02 16:38:48 +08:00
< ? php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
namespace think\db\connector ;
use PDO ;
use think\db\Connection ;
/**
* Pgsql数据库驱动
*/
class Pgsql extends Connection
{
protected $builder = '\\think\\db\\builder\\Pgsql' ;
2025-07-07 14:52:56 +08:00
// PDO连接参数
protected $params = [
PDO :: ATTR_CASE => PDO :: CASE_NATURAL ,
PDO :: ATTR_ERRMODE => PDO :: ERRMODE_EXCEPTION ,
PDO :: ATTR_ORACLE_NULLS => PDO :: NULL_NATURAL ,
PDO :: ATTR_STRINGIFY_FETCHES => false ,
];
2025-04-02 16:38:48 +08:00
/**
* 解析pdo连接的dsn信息
* @ access protected
2025-07-07 14:52:56 +08:00
* @ param array $config 连接信息
2025-04-02 16:38:48 +08:00
* @ return string
*/
protected function parseDsn ( $config )
{
$dsn = 'pgsql:dbname=' . $config [ 'database' ] . ';host=' . $config [ 'hostname' ];
2025-07-07 14:52:56 +08:00
2025-04-02 16:38:48 +08:00
if ( ! empty ( $config [ 'hostport' ])) {
$dsn .= ';port=' . $config [ 'hostport' ];
}
2025-07-07 14:52:56 +08:00
2025-04-02 16:38:48 +08:00
return $dsn ;
}
/**
* 取得数据表的字段信息
* @ access public
2025-07-07 14:52:56 +08:00
* @ param string $tableName
2025-04-02 16:38:48 +08:00
* @ return array
*/
public function getFields ( $tableName )
{
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 . '\');' ;
$pdo = $this -> query ( $sql , [], false , true );
$result = $pdo -> fetchAll ( PDO :: FETCH_ASSOC );
$info = [];
2025-07-07 14:52:56 +08:00
2025-04-02 16:38:48 +08:00
if ( $result ) {
foreach ( $result as $key => $val ) {
$val = array_change_key_case ( $val );
$info [ $val [ 'field' ]] = [
'name' => $val [ 'field' ],
'type' => $val [ 'type' ],
'notnull' => ( bool ) ( '' !== $val [ 'null' ]),
'default' => $val [ 'default' ],
'primary' => ! empty ( $val [ 'key' ]),
'autoinc' => ( 0 === strpos ( $val [ 'extra' ], 'nextval(' )),
];
}
}
2025-07-07 14:52:56 +08:00
2025-04-02 16:38:48 +08:00
return $this -> fieldCase ( $info );
}
/**
* 取得数据库的表信息
* @ access public
2025-07-07 14:52:56 +08:00
* @ param string $dbName
2025-04-02 16:38:48 +08:00
* @ return array
*/
public function getTables ( $dbName = '' )
{
$sql = " select tablename as Tables_in_test from pg_tables where schemaname ='public' " ;
$pdo = $this -> query ( $sql , [], false , true );
$result = $pdo -> fetchAll ( PDO :: FETCH_ASSOC );
$info = [];
2025-07-07 14:52:56 +08:00
2025-04-02 16:38:48 +08:00
foreach ( $result as $key => $val ) {
$info [ $key ] = current ( $val );
}
2025-07-07 14:52:56 +08:00
2025-04-02 16:38:48 +08:00
return $info ;
}
/**
* SQL性能分析
* @ access protected
2025-07-07 14:52:56 +08:00
* @ param string $sql
2025-04-02 16:38:48 +08:00
* @ return array
*/
protected function getExplain ( $sql )
{
return [];
}
protected function supportSavepoint ()
{
return true ;
}
}