add postgres support (#236)

This commit is contained in:
sunxyw 2023-01-04 16:44:26 +08:00 committed by GitHub
parent fe890025c5
commit 6238224e8c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 54 additions and 1 deletions

View File

@ -324,7 +324,7 @@ class Framework
}
$properties['db[' . $name . ']'] = match ($db['type']) {
'sqlite' => $db['type'] . '://' . $db['dbname'],
'mysql' => $db['type'] . '://' . $db['host'] . ':' . $db['port'] . '/' . $db['dbname'],
'mysql', 'pgsql' => $db['type'] . '://' . $db['host'] . ':' . $db['port'] . '/' . $db['dbname'],
default => '未知数据库类型',
};
}

View File

@ -53,6 +53,19 @@ class DBPool
$args = [];
$connect_str = str_replace(array_keys($table), array_values($table), $connect_str);
break;
case 'postgres':
case 'pgsql':
$connect_str = 'pgsql:host={host};port={port};dbname={dbname};user={username};password={password}';
$table = [
'{host}' => $config['host'],
'{port}' => $config['port'],
'{dbname}' => $config['dbname'],
'{username}' => $config['username'],
'{password}' => $config['password'],
];
$connect_str = str_replace(array_keys($table), array_values($table), $connect_str);
$args = [];
break;
default:
throw new DBException('type ' . $config['type'] . ' not supported yet');
}
@ -76,6 +89,15 @@ class DBPool
case 'mysql':
// TODO: 编写验证 MySQL 连接有效性的功能
break;
case 'postgres':
case 'pgsql':
$pool = self::$pools[$name]->get();
$a = $pool->query('select version();')->fetchAll()[0][0] ?? '';
if (str_starts_with($a, 'PostgreSQL')) {
logger()->debug('pgsql ' . $name . ' connected');
}
self::$pools[$name]->put($pool);
break;
}
}

View File

@ -600,6 +600,7 @@ class DBWrapper
return match ($type) {
'mysql' => MySQLDriver::class,
'sqlite' => SQLiteDriver::class,
'pgsql', 'postgres' => PgSQLDriver::class,
default => throw new DBException('Unknown database type: ' . $type),
};
}

View File

@ -0,0 +1,30 @@
<?php
declare(strict_types=1);
namespace ZM\Store\Database;
use Doctrine\DBAL\Driver\AbstractPostgreSQLDriver;
use Doctrine\DBAL\Driver\Connection;
class PgSQLDriver extends AbstractPostgreSQLDriver
{
public function connect(array $params, $username = null, $password = null, array $driverOptions = [])
{
logger()->debug('Requiring new connection');
return new DBConnection($params);
}
public function getName()
{
return 'pdo_pgsql_pool';
}
public function getDatabase(Connection $conn)
{
if ($conn instanceof DBConnection) {
return config('database')[$conn->getPoolName()]['dbname'] ?? '';
}
return '';
}
}