我正在尝试使用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”
有人解决了这个问题吗?
答案 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的