Prisma无法连接到PostgreSQL。

19
我曾尝试多次将Prisma与postgreSQL连接。 但是,Prisma显示了以下错误信息:"Error: undefined: invalid port number in "postgresql://postgres:password@localhost:5432/linker")"。
- 错误 enter image description here

-prisma/.env

DATABASE_URL=postgresql://postgres:password@localhost:5432/linker

-schema.prisma

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

所以,首先我检查了端口号,看看是否正确,5432是正确的,因为我使用默认端口号。我还检查了postgresql.conf文件,其中设置为“listen_address =”*“”,“port = 5432”。

enter image description here

我进入了pgAdmin4并查看了服务器属性。如下图所示,端口号为5432,用户名设置为"postgres"。

enter image description here

我不知道为什么Prisma无法连接
是我错过了什么吗?


1
"Prisma" 运行在哪里?是在与数据库服务器相同的机器上还是在 Docker 容器中...? - madflow
@madflow 同一台机器,我正在使用 Windows 10 和 Visual Studio Code。 - sdy
5个回答

62

使用百分号编码替换特殊字符

请确保在.env文件的DATABASE_URL中,您用户名和密码中的特殊字符已经被替换为百分号编码。

例如,在数据库URL中,如果您的用户名或密码包含字符@,则应将其替换为相应的百分号编码,即%40。对于#,它是%23,以此类推。请参阅下面的列表。

百分号编码

以下是常用特殊字符的百分号编码:

特殊字符 百分号编码
! %21
# %23
$ %24
% %25
& %26
' %27
( %28
) %29
* %2A
+ %2B
, %2C
/ %2F
: %3A
; %3B
= %3D
? %3F
@ %40
[ %5B
] %5D
newline %0A%0D%0D%0A
space %20
" %22
% %25
- %2D
. %2E
< %3C
> %3E
\ %5C
^ %5E
_ %5F
` %60
{ %7B
| %7C
} %7D
~ %7E
£ %C2%A3
%E5%86%86

1
谢谢!这个方法有效了,我用上述编码替换了所有特殊字符,现在能正常运行了。 - TRomesh
有没有任何库可以做到这一点? - Nobody
1
@Nobody,我不知道有没有现成的,但你可以很容易地通过扫描字符串并用相应的字符替换它们来编写自己的。 - Yogesh Umesh Vaity
是的,那就是我最终做的,谢谢! - Nobody
2
@user210757,在您的用户名和密码中只使用$$。这将导致mysql://USER:PA%24%24WORD@HOST:PORT/DATABASE?connection_limit=5。我希望您在实际的URL中提供了HOST、PORT和DATABASE的实际值,而这只是一个示例字符串。 - Yogesh Umesh Vaity
显示剩余3条评论

6

如果有人遇到这个问题,请参阅上面答案的评论!

从数据库密码中删除符号(托管在AWS RDS上)解决了我的问题。


在 Supabase 上也是如此。 - Ron FND

3

为了在数据库连接字符串中使用密码,您应将其转换为URL编码格式。

接受的答案是正确的。

但我想展示一种编程简单的解决方案,因为手动替换密码中的特殊字符容易出错。

您的计算机上已安装NodeJS(显然,因为您正在尝试使用Prisma)

打开终端并启动一个NodeJS进程(当前目录不重要):

node

然后输入以下内容,按回车键:
     new URLSearchParams({pass: "YOUR_PASSWORD_WITH_SPECIAL_CHARACTERS"}).toString().substring(5)

结果,您将获得您的密码的URL编码版本并打印到控制台上:

'YOUR_PASSWORD_URL_ENCODED'

将其复制(不带引号)并将其用作数据库连接字符串中的密码。


2

添加Yogesh的答案。与其手动转换字符,您可以使用浏览器的控制台并运行此命令:

encodeURIComponent('your-password')

并将它们复制粘贴。


0

Yogesh的回答非常详细。对于使用VSCode并想要在不查找编码表和离开编辑器的情况下转换带有特殊字符的密码的人,VS Utils扩展支持URL编码功能。

  1. 安装VS Utils扩展。
  2. 选择要编码的密码。
  3. 按下Ctrl + Shift + P,然后选择VS Utils:选择要执行的转换
  4. 选择URL编码

就这样,密码现在已经被编码了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接