gpt4 book ai didi

postgresql - 尝试访问数据库或从数据库获取数据时,用户的 PostgresQL 密码身份验证失败的问题?

转载 作者:行者123 更新时间:2023-12-05 08:47:40 25 4
gpt4 key购买 nike

我在尝试从 postgressql 获取数据时遇到问题。我正在使用 .NET Core 5.0 和 postgressql 作为我的数据库解决方案来研究微服务架构。

我正在尝试使用 docker 容器将我的应用程序容器化。一切正常,直到我尝试通过 API 获取一些数据。

我遇到了这种类型的错误:

Npgsql.PostgresException (0x80004005): 28P01: password authentication failed for user "admin"
at Npgsql.NpgsqlConnector.<ReadMessage>g__ReadMessageLong|194_0(NpgsqlConnector connector, Boolean async, DataRowLoadingMode dataRowLoadingMode, Boolean readingNotifications, Boolean isReadingPrependedMessage)
at Npgsql.NpgsqlConnector.AuthenticateMD5(String username, Byte[] salt, Boolean async, CancellationToken cancellationToken)
at Npgsql.NpgsqlConnector.Authenticate(String username, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
at Npgsql.NpgsqlConnector.Open(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
at Npgsql.ConnectorPool.OpenNewConnector(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
at Npgsql.ConnectorPool.<>c__DisplayClass38_0.<<Rent>g__RentAsync|0>d.MoveNext()
--- End of stack trace from previous location ---
at Npgsql.NpgsqlConnection.<>c__DisplayClass41_0.<<Open>g__OpenAsync|0>d.MoveNext()
--- End of stack trace from previous location ---
at Dapper.SqlMapper.QueryRowAsync[T](IDbConnection cnn, Row row, Type effectiveType, CommandDefinition command) in /_/Dapper/SqlMapper.Async.cs:line 472

从后端的角度来看,我尝试通过产品名称获取数据的情况非常简单:

public async Task<Coupon> GetDiscount(string productName)
{
using var connection = new NpgsqlConnection
(_configuration.GetValue<string>("DatabaseSettings:ConnectionString"));

var coupon = await connection.QueryFirstOrDefaultAsync<Coupon>
("SELECT * FROM Coupon WHERE ProductName = @ProductName", new { ProductName = productName });

if (coupon == null)
return new Coupon
{ ProductName = "No Discount", Amount = 0, Description = "No Discount Desc" };

return coupon;
}

我的 appsettings.json 文件,或者更准确地说,指向 postgressql 的连接字符串是这样的:

 "DatabaseSettings": {
"ConnectionString": "Server=localhost;Port=5432;Database=DiscountDb;User Id=admin;Password=admin1234;"
},

在 docker compose override yml 文件中我有:

discountdb:
container_name: discountdb
environment:
- POSTGRES_USER=admin
- POSTGRES_PASSWORD=admin1234
- POSTGRES_DB=DiscountDb
restart: always
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data/

正如我所见,在我的 portainer 中我可以看到 discountdb 已启动并正在运行 enter image description here

我错过了什么,我不知道是什么。

最佳答案

在容器中运行应用程序时,您可能需要更新连接字符串。我假设您无法访问数据库。

您正在根据 appsettings.json 从应用内引用 localhost,除非您已覆盖连接字符串。容器中的 localhost 是它自己的上下文。

因此,您的连接字符串如下所示。

"Server=localhost;Port=5432;Database=DiscountDb;User Id=admin;Password=admin1234;"

但它可能看起来像这样(docker compose 的 docker 网络将解析名称):

"Server=discountdb;Port=5432;Database=DiscountDb;User Id=admin;Password=admin1234;"

因此,在您的 pgadmin 服务下的 docker compose 文件中,您可以添加一个环境部分(如果您还没有),以覆盖连接字符串。

environment:
- DatabaseSettings:ConnectionString="Server=discountdb;Port=5432;Database=DiscountDb;User Id=admin;Password=admin1234;"

覆盖中可能应该没有 "

关于postgresql - 尝试访问数据库或从数据库获取数据时,用户的 PostgresQL 密码身份验证失败的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67106691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com