Преобразование объекта базы данных в строку URL базы данных


Я определил свое собственное подключение к базе данных в файле настроек Drupal следующим образом:

$databases['migrate']['default'] = array(
  'driver' => 'mysql',
  'database' => 'drupal',
  'username' => 'root',
  'password' => 'root',
  'host' => 'localhost',
  'prefix' => '',
);

Чтобы прочитать это в формате Объекта базы данных , вы можете запустить:

drush eval 'print_r(Database::getConnectionInfo("default", "migrate"));'

И теперь я хотел бы иметь строковое представление (аналогичное $db_url в Drupal 6), чтобы использовать его в некоторых командах drush в этой базе данных, например drush --db-url=${DB_URL} status.

Поэтому я хотел бы преобразовать приведенный выше формат массива базы данных в формат строки URL базы данных (например, mysql://root:root@localhost/drupal).

Есть ли есть какой-нибудь простой способ сделать это с помощью функции, PHP-кода или drush?


Дополнительная информация:

  • Существует функция update_parse_db_url(), но она преобразует URL-адреса подключения к базе данных и возвращает массив, совместимый с D7.
Author: kenorb, 2013-12-16

3 answers

Использование Drush:

drush sa @site --with-db-url

Или, чтобы изолировать только URL-адрес базы данных:

drush sa @site --with-db-url --format=csv --fields=db-url --field-labels=0
 5
Author: greg_1_anderson, 2013-12-16 15:09:41

Вот однострочный текст:

drush eval '$db = Database::getConnection("default", "migrate")->getConnectionOptions();  echo $db["driver"] . "://" . $db["username"] . ":" . $db["password"] . "@" . $db["host"] . ":" . $db["port"] . "/" . $db["database"];'

Для долгосрочного решения этого можно достичь, определив команду drush в вашем модуле (foo.drush.inc):

/**
 * Implements hook_drush_command().
 */
function foo_drush_command() {
  $items = array();
  $items['get-db-uri'] = array(
    'callback'  => 'foo_drush_get_db_uri',
    'arguments' => array(
      'name' => array(
        'description' => dt('Database name.'),
        'required'    => TRUE,
      ),
      'key' => array(
        'description' => dt('Key.'),
        'required'    => TRUEs,
      ),
    ),
    'description' => dt('Returns database URI for a specified name and key.'),
    'examples' => array(
      'drush get-db-uri migrate default' => dt('Will return db uri in format: driver://user:pass@host:port/dbname'),
    ),
  );

  return $items;
}

/**
 * Implements hook_drush_help().
 */
function foo_drush_help($section) {
  switch ($section) {
    case 'get-db-uri':
      return dt("Returns database URI.");
  }
}

/**
 * Drush command (get-db-uri).
 *
 * Returns database URI for a specified name and key.
 *
 * @param string $name
 *   Database name.
 * @param string $key
 *   Key.
 */
function foo_drush_get_db_uri($name, $key) {
  $connection = Database::getConnection($key, $name);
  $info       = $connection->getConnectionOptions();

  echo $info['driver'] . '://' . $info['username'] . ':' . $info['password'] . '@' . $info['host'] . ':' . $info['port'] . '/' . $info['database'];
}

Пример использования:

drush get-db-uri migrate default
 0
Author: kenorb, 2013-12-23 10:30:51

В случае, если вы загрузили экземпляр drupal, drush и jq установили

drush status --fields="db-driver,db-hostname,db-port,db-username,db-password,db-name" --format="json" | jq '."db-driver"+"://"+."db-username"+":"+."db-password"+"@"+."db-hostname"+":"+."db-port"+"/"+."db-name"'
 0
Author: digitaldonkey, 2020-05-12 16:01:27