Drupal:我怎么知道db是mysql还是postgres

时间:2013-07-28 12:41:39

标签: mysql postgresql drupal compatibility

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

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

2 个答案:

答案 0 :(得分:6)

正如@kordirko所说,一个选项是查询服务器版本:SELECT version();将同时适用于MySQL和PostgreSQL,但不是most other database engines

解析版本字符串总是有点脆弱,并且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的内容。如果您要连接到像EnterpriseDB Postgres Plus或MySQL- 兼容数据库的PostgreSQL- 兼容数据库,您会怎么做?

使用the Drupal function for the purpose, DatabaseConnection::databaseType更安全。这样可以避免查询到数据库的往返,可以处理不理解/接受SELECT version()的数据库,并且可以避免解析版本字符串。

你会发现this bug report很有用;它表明正确的用法是Database::getConnection()->databaseType()

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

答案 1 :(得分: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 Database API页面中:

database.inc abstract public 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 Database API
Drupal Base Database API class