我最近在Azure上创建了一个Postgres数据库,并且在查找我的数据库URI时遇到了很多麻烦。信用证看起来像:
服务器:name.postgres.database.azure.com
用户(管理员角色):admin @ name
密码:mypassword
数据库名称:postgres
因此,我尝试使用psql
并传入连接字符串psql postgresql://admin@name:mypassword@name.postgres.database.azure.com:5432/postgres
但它给了我一个错误
psql:无法翻译主机名"名称"解决:nodename也不是 提供或未知的servname
有趣的是,这有效:
psql -h name.postgres.database.azure.com -p 5432 -U admin@name postgres
我问的原因是因为我想使用Python和sqlalchemy并希望传入DB uri字符串。
答案 0 :(得分:1)
好吧,至少对我而言,这是有效的。如果其他人遇到同样的问题,请在此处发布。
的PostgreSQL://管理员@名:password@name.postgres.database.azure.com:5432 / postgres的
psql
,以下内容对我有用:
psql“dbname = postgres host = name.postgres.database.azure.com user = admin @ name password = password port = 5432”请注意,请小心转义任何特殊字符(例如密码)。例如,我正在使用一个bash shell,并且有特殊字符会引发一些奇怪的怪异。
您还可以按照此处的说明解析网址:Connect to an URI in postgres
答案 1 :(得分:0)
根据我的经验,使用连接url作为psql
的连接字符串的错误是由使用Greed-Pattern算法的psql
连接字符串解析器引起的。
根据psql连接字符串的31.1.2. Parameter Key Words
小节,user
参数关键字定义如下。
用户
要连接的PostgreSQL用户名。默认值与运行应用程序的用户的操作系统名称相同。
user
命名需要匹配正则表达式
通过NAME_REGEX
配置变量配置,如下所示,请参阅文档Linux Username Conventions
以了解详细信息。
NAME_REGEX
根据此常规检查用户名和组名 表达。如果名称与此正则表达式不匹配,则用户和 除非--force-badname是,否则拒绝在adduser中创建组 组。设置--force-badname后,仅执行弱检查。 默认值是最保守的^ [a-z] [ - a-z0-9] * $。
因此,Azure上的postgres用户名不是标准的类Unix名称,它与Azure服务的Azure用户命名模式username@servname
匹配,例如Azure for Azure App服务,Azure SQL数据库和Azure上的Postgres等等。
以上原因导致Azure postgres连接url与psql
工具不兼容,但不担心将Python与psycopg2
一起使用,您可以参考官方教程{{3知道它。