【问题标题】:Drupal : How can I know if the db is mysql or postgresDrupal:我怎么知道数据库是 mysql 还是 postgres
【发布时间】:2013-07-28 12:41:38
【问题描述】:

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

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

【问题讨论】:

  • 试试select version();

标签: mysql postgresql drupal compatibility


【解决方案1】:

正如@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 的东西。如果您要连接到 PostgreSQL-兼容 数据库(如 EnterpriseDB Postgres Plus)或 MySQL-兼容 数据库,您会怎么做?

使用the Drupal function for the purpose, DatabaseConnection::databaseType 更安全。这避免了到数据库的查询往返,将适用于无法理解/接受SELECT version() 的数据库,并且将避免解析版本字符串的需要。

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

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

【讨论】:

  • 这是正确的。这里有两个非常有用的链接,可以帮助您使用 Drupal 的数据库抽象层。 API docs & documentation
【解决方案2】:

只要抽象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 Database API
Drupal Base Database API class

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 2011-07-23
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多