如何验证mysql数据库uri

6qfn3psc  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(587)

我正在尝试将一个名为blazer的gem与我的rails应用程序集成,并且我必须在blazer.yml文件中指定mysql数据库url,以便它可以访问暂存和生产环境中的数据。
我相信定义mysql数据库url的标准格式是

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

我用与字符串相同的格式定义了我的url,当我验证uri时,我得到以下错误
uri::invalidurierror:错误的uri(不是uri?):mysql2://f77\u oe\u 85_staging:lcch%264855c6m;KG9YGHJJZC公司?jqugvk@factory97-aurora-staging-cluster.cluster-cmj77682fpy4kjl.us-east-1.rds.amazonaws.com/factory97_oe85_staging
已定义的mysql数据库url:

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

请给出建议

iyfjxgzm

iyfjxgzm1#

uri无效。
问题是密码包含在uri中无效的字符。这个 username:passworduserinfo 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 . 看起来密码只是部分转义了。

des4xlb0

des4xlb02#

我认为一个问题是这个问题没有很好的孤立。下面是一个如何隔离它的示例策略。
的错误代码 URI::InvalidURIError: bad URI(is not URI?): 仅表示库(blazer gem)已成功读取文件,该文件可能是或不是您编辑的文件, /YOUR_DIR/blazer.yml 或者别的什么,但是仍然无法解析uri。
现在,需要考虑的问题包括:
blazer gem真的读过吗 /YOUR_DIR/blazer.yml ?
yml的预处理器是否按预期工作?
指定的uri密钥是否正确? mysql: 或者 mysql2 ?
ip、端口、帐户名、密码和数据库名的格式是否都正确?特别是,特殊字符是否正确转义(特殊字符见mysql文档)
我想op知道其中一些问题的答案,但我们不知道。所以,让我们假设它们中的任何一个都可能是一个问题。
建议的策略是:
找到至少格式正确的uri,并确认gemblazer正确解析和识别了它。注意,您只需要测试格式,所以伪参数就可以了。例如,尝试下面的组合,看看哪个不会产生错误 URI::InvalidURIError : mysql://127.0.0.1/test mysql://adam:alphabetonly@127.0.0.1/test jdbc:mysql://adam:alphabetonly@127.0.0.1/test 现在,你至少知道潜在的问题(1),(3),(4)是不相关的。
将ip(主机名)、帐户名、密码和数据库名逐个替换为真实的名称,然后查找引发错误的名称 URI::InvalidURIError . 现在,您已经缩小了导致问题的部分。在op的例子中,我怀疑问题是密码部分的特殊字符转义不正确。假设是这样,然后,
正确地转义该部分,以便它们作为一个整体形成正确的uri格式。@schwern的回答是对格式的一个很好的总结。作为提示,您可以通过打开rail的控制台(通过 rails c )还有打字 URI.encode('YOUR_PASSWORD') 或者,在(unix shell)终端中直接从命令行运行ruby:

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

替换中uri中的密码部分 /YOUR_DIR/blazer.yml 并确认它没有发出错误 URI::InvalidURIError (希望如此)。
在这些处理过程中,我故意避开了预处理器部分(2)。对“rails不在产品上解析数据库url”的回答提到 URI.encode('YOUR_PASSWORD') 但它隐式地假定预处理器工作正常。在测试阶段,这只会增加另一层复杂性,因此最好跳过它。如果您在生产中需要它(屏蔽密码等),请稍后在您知道其他一切正常的情况下实现它。
希望等到op尝试了所有这些,问题就解决了。

相关问题