我正在尝试将一个名为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'
请给出建议
2条答案
按热度按时间dldeef671#
uri无效。
问题是密码包含在uri中无效的字符。这个
username:password
是userinfo
uri的一部分。来自rfc 3986。。。特别是
?
在密码中LcCh%264855c6M;kG9yGhjghjZC?JquGVK
. 看起来密码只是部分转义了。0qx6xfy62#
我认为一个问题是这个问题没有很好的孤立。下面是一个如何隔离它的示例策略。
的错误代码
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/testjdbc: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:替换中uri中的密码部分
/YOUR_DIR/blazer.yml
并确认它没有发出错误URI::InvalidURIError
(希望如此)。在这些处理过程中,我故意避开了预处理器部分(2)。对“rails不在产品上解析数据库url”的回答提到
URI.encode('YOUR_PASSWORD')
但它隐式地假定预处理器工作正常。在测试阶段,这只会增加另一层复杂性,因此最好跳过它。如果您在生产中需要它(屏蔽密码等),请稍后在您知道其他一切正常的情况下实现它。希望等到op尝试了所有这些,问题就解决了。