3

複雑なクエリがあり、モジュールが mysql と postgres の両方で動作する必要があるため、2 つのバージョンを作成する必要があります。

残念ながら、使用しているデータベースがmysqlかpostgresかを確認して、どちらのクエリが使用されているかを確認する方法がわかりません。関数がこの値を返すことができるかどうか知っていますか?

4

2 に答える 2

6

@kordirko が言うように、1 つのオプションはサーバーのバージョンを照会することです。MySQL と PostgreSQL の両方で動作しますが、他のほとんどのデータベースエンジンSELECT version();では動作しません。

ただし、バージョン文字列の解析は常に少し脆弱であり、MySQL は のようなバージョン番号のみを返しますが、5.5.32PostgreSQL は のようなものを返します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 のようなPostgreSQL互換のデータベース、または MySQL互換のデータベースに接続している場合はどうしますか?

という目的で Drupal 機能DatabaseConnection::databaseTypeを使用する方がはるかに安全です。これにより、DB へのクエリのラウンドトリップが回避され、理解/受け入れられないデータベースで機能し、SELECT version()バージョン文字列を解析する必要がなくなります。

このバグ レポートは役に立ちます。正しい使い方はDatabase::getConnection()->databaseType().

(私は Drupal を使用したことさえありません。これを検索しただけです)。

于 2013-07-28T13:44:52.263 に答える
3

抽象DatabaseConnectionクラスが PDO クラスを拡張している限り、現在のデータベース ドライバーを知るために pdo メソッドを呼び出すことができます。

例えば:

$conn = Database::getConnection();
print $conn->getAttribute($conn::ATTR_DRIVER_NAME); #returns mysql, pgsql...

DatabaseConnection::driver()を使用してそれを行う 2 つ目の方法があります。

print $conn->driver();

またはDatabaseConnection::databaseType() ;

print $conn->databaseType();

DatabaseConnection::driver() と DatabaseConnection::databaseType() は似たような関数ですが、等しくないことに注意してください! DatabaseConnection::driver() メソッドからの戻り値は、実装およびその他の要因によって異なります。Drupal データベース API ページ:

database.inc 抽象 public DatabaseConnection::driver()

これは、必ずしもデータベース自体のタイプと同じではありません。たとえば、mysql と mysql_mock という 2 つの MySQL ドライバーがあるとします。この関数はそれぞれに異なる値を返しますが、どちらも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 クラス

于 2013-07-28T15:33:21.133 に答える