无法连接到azure postresql - 用户名应为<username @ hostname>格式

时间:2018-03-27 20:35:10

标签: postgresql azure sqlalchemy ckan

我正在尝试使用azure PostgreSQL进行CKAN(ckan.org) CKAN使用http://www.sqlalchemy.org/进行数据库连接。

连接字符串如下所示:

engine = create_engine('postgresql://scott:tiger@myhost.postgres.database.azure.com:5432/mydatabase')

语法是:

postgresql://username:password@hostname:5432/databasename

尝试连接到azure postgresql时出现此错误:

  

致命错误:指定的用户名无效。请检查用户名和   重试连接。用户名应采用username @ hostname格式。

如果我尝试使用这样的用户名格式:

postgresql://scott@myhost:tiger@myhost.postgres.database.azure.com:5432/mydatabase

然后我得到:

  

无效的端口号:“tiger@myhost.postgres.database.azure.com:5432”

有人解决了这个问题吗?

2 个答案:

答案 0 :(得分:1)

扩展Allan Kristensen的回答,如果你正在使用数据存储扩展(与CKAN Core捆绑在一起),你最终会遇到问题。

查看CKAN的代码库,问题出在https://github.com/ckan/ckan/blob/555e0960c43d0ca86066b1954e5c94aad565baa7/ckanext/datastore/backend/postgres.py#L1592(如果您运行的是2.6.5或更低,则为https://github.com/ckan/ckan/blob/ckan-2.6.4/ckanext/datastore/plugin.py#L200

因此,当CKAN使用SELECT has_table_privilege('scott@myhost', '_foo', 'INSERT')查询数据库时,它失败了,因为没有名为scott@myhost的用户。 Azure正在使用用户名做一些时髦的事情,就好像您要求数据库列出用户一样,您会看到数据库认为您的用户名是scott(至少知道它对我做了什么...)

一个可能的,hackish,修复是:

sed -i '' 's/read_connection_user = sa_url.make_url(self.read_url).username/read_connection_user = split(sa_url.make_url(self.read_url).username, "@")[0]/' /srv/app/src/ckan/ckanext/datastore/plugin.py
sed -i '' 's/import sys/import sys\nfrom string import split/' /srv/app/src/ckan/ckanext/datastore/plugin.py

以上适用于2.6.5。如果您正在运行2.7 +

,请使用/srv/app/src/ckanext/datastore/backend/postgres.py替换文件路径

上述应该有效,直到上游找到了正确的解决办法。

答案 1 :(得分:0)

无效的端口号是由用户名中的@引起的。

连接网址应如下所示。

的PostgreSQL://斯科特%40myhost:tiger@myhost.postgres.database.azure.com:5432 / MyDatabase的