我有一个复杂的查询,因为我需要我的模块同时处理mysql和postgres,我需要编写它的两个版本。
不幸的是,我不知道如何检查我使用的db是mysql还是postgres,以了解使用哪个查询。你知道函数是否可以返回这个值吗?
答案 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