Как проверить URI базы данных mysql - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь интегрировать Gem с именем Blazer в свое приложение Rails, и мне нужно указать URL базы данных mysql в файле blazer.yml, чтобы он мог обращаться к данным в промежуточной и производственной средах.

Я считаю, что стандартный формат для определения URL базы данных MySQL:

mysql2://user:password@hostname:3306/database

Я определил свой URL в том же формате, что и строка, и когда я проверяю URI, я получаю следующую ошибку

URI :: InvalidURIError: неверный URI (не является URI?): Mysql2: // f77_oe_85_staging: LcCh% 264855c6M; kG9yGhjghjZC? JquGVK@factory97-aurora-staging-cluster.k68.py4x64.py.plf.php.pl_ru_clus.py.cluster.dll-1.rds.amazonaws.com/factory97_oe85_staging

URL-адрес базы данных Mysql:

'mysql2://f77_oe_85_staging:LcCh%264855c6M;kG9yGhjghjZC?JquGVK@factory97-aurora-staging-cluster.cluster-cmj77682fpy4kjl.us-east-1.rds.amazonaws.com/factory97_oe85_staging'

Пожалуйста, советуйте

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Я думаю, проблема в том, что проблема не очень изолирована.Вот пример стратегии его изоляции.

Код ошибки URI::InvalidURIError: bad URI(is not URI?): указывает только на то, что библиотека (гем блейзера) успешно прочитала файл, который может или не может бытьфайл, который вы отредактировали, /YOUR_DIR/blazer.yml или что-то еще, но, тем не менее, не удалось проанализировать URI.

Теперь необходимо рассмотреть следующие вопросы:

  1. blazer gem действительно прочитал /YOUR_DIR/blazer.yml?
  2. работает ли препроцессор yml должным образом?
  3. Правильно ли указан ключ uri ?
  4. mysql: или mysql2?
  5. правильны ли форматы IP, порта, имени учетной записи, пароля и имени базы данных?В частности, правильно ли экранированы специальные символы?(См. MySql документ о специальных символах )

Я полагаю, что ОП знает ответы на некоторые из этих вопросов, но мы этого не делаем.Итак, давайте предположим, что любой из них может быть проблемой.

Тогда предложенная стратегия будет такой:

  1. Найдите URI, который хотя бы в правильном формате, и подтвердитеон анализируется и корректно распознается Gem blazer.Обратите внимание, что вам нужно только проверить формат, поэтому фиктивные параметры в порядке.Например, попробуйте комбинацию следующего и посмотрите, что не выдает ошибку URI::InvalidURIError:

    1. mysql://127.0.0.1/test
    2. mysql://adam:alphabetonly@127.0.0.1/test
    3. jdbc:mysql://adam:alphabetonly@127.0.0.1/test

    Теперь вы знаете, по крайней мере, потенциальные проблемы (1), (3), (4) не имеют значения.

  2. Замените IP (имя хоста), аккаунтимя, пароль и имя базы данных одно за другим с реальным и найдите, что вызывает ошибку URI::InvalidURIError.Теперь вы сузили, какая часть вызывает проблему.Я подозреваю, что в случае с OP проблема заключается в неправильном экранировании специальных символов в части пароля.Давайте предположим, что это так, а затем
  3. должным образом экранируют часть, чтобы они сформировали правильный формат URI в целом.Ответ @Schwern - хорошее резюме о формате.В качестве подсказки вы можете получить escape-URI, открыв консоль Rail (через rails c) и набрав URI.encode('YOUR_PASSWORD') или, альтернативно, запустив ruby ​​непосредственно из командной строки в терминале (UNIX-shell):

    ruby -ruri -e "puts URI.encode('YOUR_PASSWORD')"
    

    Замените парольную часть в URI в /YOUR_DIR/blazer.yml на экранированную строку и подтвердите, что она не выдает ошибку URI::InvalidURIError (надеюсь).

При такой обработкеЯ сознательно избегал препроцессорной части (2). В этом ответе на "Rails не анализирует URL базы данных в рабочей среде" упоминается о URI.encode('YOUR_PASSWORD') в файле yml, но это неявно предполагает, что препроцессор работает нормально.На этапе тестирования это просто добавляет еще один слой усложнения, и поэтому лучше его пропустить.Если вам нужно это в вашем производстве (чтобы замаскировать пароль и т. Д.), Внедрите его позже, когда вы будете знать, что все остальное работает нормально.

Надеюсь, что к тому времени, когда ОП попробует все это, проблема решена.

0 голосов
/ 17 октября 2018

Недопустимый URI.

Проблема в том, что пароль содержит недопустимые символы в URI.username:password является частью userinfo URI.От RFC 3986 ...

  foo://example.com:8042/over/there?name=ferret#nose
  \_/   \______________/\_________/ \_________/ \__/
   |           |            |            |        |
scheme     authority       path        query   fragment

authority   = [ userinfo "@" ] host [ ":" port ]
userinfo    = *( unreserved / pct-encoded / sub-delims / ":" )

pct-encoded = "%" HEXDIG HEXDIG
unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"
sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
            / "*" / "+" / "," / ";" / "="

В частности это ? в пароле LcCh%264855c6M;kG9yGhjghjZC?JquGVK.Похоже, что пароль только частично экранирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...