Drupal:如何知道数据库是MySQL还是PostgreSQL

3

我有一个复杂的查询,由于需要让我的模块在mysql和postgres上工作,所以我需要编写两个版本。

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


2
尝试执行 select version(); - krokodilko
2个回答

7

@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这样的东西。如果你连接到一个像EnterpriseDB Postgres Plus或MySQL兼容的数据库,你该怎么办?

更安全的做法是使用Drupal函数,DatabaseConnection::databaseType。这样可以避免向数据库发送查询请求,适用于无法理解/接受SELECT version()的数据库,并且可以避免解析版本字符串的需要。

您会发现这个错误报告很有用;它建议正确的用法是Database::getConnection()->databaseType()

(我甚至从未使用过Drupal,我只是搜索到了这个内容)。


1
这是正确的。以下是两个非常有用的链接,可帮助您使用Drupal的数据库抽象层。API文档文档 - stevenw00

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 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数据库API
Drupal基本数据库API类


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接