3

我有一个复杂的查询,因为我需要我的模块同时在 mysql 和 postgres 上工作,我需要编写它的两个版本。

不幸的是,我不知道如何检查我使用的数据库是 mysql 还是 postgres,以了解使用哪个查询。你知道一个函数是否可以返回这个值吗?

4

2 回答 2

6

正如@kordirko 所说,一种选择是查询服务器版本:SELECT version();将在 MySQL 和 PostgreSQL 上工作,但不是大多数 其他数据库 引擎

不过,解析版本字符串总是有点脆弱,MySQL 只返回一个版本号,5.5.32而 PostgreSQL 返回类似PostgreSQL 9.4devel on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8), 64-bit. 如果您要连接到与 PostgreSQL兼容的数据库(如 EnterpriseDB Postgres Plus)或与 MySQL兼容的数据库,您会怎么做?

为此目的使用 Drupal 功能DatabaseConnection::databaseType要安全得多, . 这避免了到数据库的查询往返,将在无法理解/接受的数据库上工作SELECT version(),并且将避免解析版本字符串的需要。

你会发现这个错误报告很有用;它表明正确的用法是Database::getConnection()->databaseType().

(我什至从未使用过 Drupal,我只是搜索了这个)。

于 2013-07-28T13:44:52.263 回答
3

只要抽象的DatabaseConnection类扩展了 PDO 类,就可以调用 pdo 方法来了解当前的数据库驱动程序。

例如:

$conn = Database::getConnection();
print $conn->getAttribute($conn::ATTR_DRIVER_NAME); #returns mysql, pgsql...

还有第二种方法可以使用DatabaseConnection::driver()

print $conn->driver();

DatabaseConnection::databaseType()

print $conn->databaseType();

请注意,DatabaseConnection::driver() 和 DatabaseConnection::databaseType() 是相似的函数,但不等于!DatabaseConnection::driver() 方法的返回值取决于实现和其他因素。在 Drupal 数据库 API 页面中:

database.inc 抽象公共 DatabaseConnection::driver()

这不一定与数据库本身的类型相同。例如,可能有两个 MySQL 驱动程序,mysql 和 mysql_mock。此函数将为每个返回不同的值,但两者都将为databaseType()返回“mysql” 。

在大多数情况下,您只想使用 $conn->getAttribute($conn::ATTR_DRIVER_NAME)$conn->databaseType()

如果你想获得更具体的属性,你应该利用 PHP ReflectionClass 特性:

$conn = Database::getConnection();
$ref = new ReflectionClass($conn);
#ref->getProperties, ref->getConstants $ref->isAbstract...

参考:
PDO::getAttribute
PDO::ATTR_DRIVER_NAME
Drupal 数据库 API
Drupal 基础数据库 API 类

于 2013-07-28T15:33:21.133 回答