我有一个复杂的查询,由于需要让我的模块在mysql和postgres上工作,所以我需要编写两个版本。
不幸的是,我不知道如何检查我使用的数据库是mysql还是postgres,以知道使用哪个查询。你知道是否有一个函数可以返回这个值吗?
我有一个复杂的查询,由于需要让我的模块在mysql和postgres上工作,所以我需要编写两个版本。
不幸的是,我不知道如何检查我使用的数据库是mysql还是postgres,以知道使用哪个查询。你知道是否有一个函数可以返回这个值吗?
@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,我只是搜索到了这个内容)。
$conn = Database::getConnection();
print $conn->getAttribute($conn::ATTR_DRIVER_NAME); #returns mysql, pgsql...
有第二种方法可以使用DatabaseConnection::driver():
print $conn->driver();
print $conn->databaseType();
$conn = Database::getConnection();
$ref = new ReflectionClass($conn);
#ref->getProperties, ref->getConstants $ref->isAbstract...
参考资料:
PDO::getAttribute
PDO::ATTR_DRIVER_NAME
Drupal数据库API
Drupal基本数据库API类
select version();
- krokodilko