错误:无法连接到数据库:Rust中的密码身份验证失败

问题描述

我正在尝试使用sqlx板条箱和Postgres数据库连接到Rust中的数据库。

main.rs

use dotenv;
use sqlx::Pool;
use sqlx::PgPool;
use sqlx::query;

#[async_std::main]
async fn main() -> Result<(),Error> {
    
    

    dotenv::dotenv().ok();
    pretty_env_logger::init();
    let url = std::env::var("DATABASE_URL").unwrap();
    dbg!(url);

    let db_url = std::env::var("DATABASE_URL")?;
    let db_pool: PgPool = Pool::new(&db_url).await?;

    let rows = query!("select 1 as one").fetch_one(&db_pool).await?;
    dbg!(rows);

    


    let mut app = tide::new();
    app.at("/").get(|_| async move {Ok("Hello Rustacean!")});
    app.listen("127.0.0.1:8080").await?;

    Ok(())
}

#[derive(thiserror::Error,Debug)]
enum Error {
    #[error(transparent)]
    DbError(#[from] sqlx::Error),#[error(transparent)]
    IoError(#[from] std::io::Error),#[error(transparent)]
    VarError(#[from] std::env::VarError),}

这是我的.env文件:

DATABASE_URL=postgres://localhost/twitter
RUST_LOG=trace

错误日志:

error: failed to connect to database: password authentication failed for user "ayman"
  --> src/main.rs:19:16
   |
19 |     let rows = query!("select 1 as one").fetch_one(&db_pool).await?;
   |                ^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: this error originates in a macro (in Nightly builds,run with -Z macro-backtrace for more info)

error: aborting due to previous error

error: could not compile `backend`.

注意:

  1. 存在一个名为twitter的数据库。
  2. 我已经包含了macros用于sqlx的依赖关系
sqlx = {version="0.3.5",features = ["runtime-async-std","macros","chrono","json","postgres","uuid"]}

我是否缺少用于连接数据库的某种级别的身份验证?我在sqlx::Query macro

的文档中找不到它

解决方法

无法认证的原因是访问数据库前必须提供凭据

有两种方法

选项 1: 更改您的 URL 以包含凭据 - 例如 -

DATABASE_URL=postgres://localhost?dbname=mydb&user=postgres&password=postgres

选项 2 使用 PgConnectionOptions - 例如

let pool_options = PgConnectOptions::new()
        .host("localhost")
        .port(5432)
        .username("dbuser")
        .database("dbtest")
        .password("dbpassword");

    let pool: PgPool = Pool::<Postgres>::connect_with(pool_options).await?;

注意:我使用的 sqlx 版本是 sqlx = {version="0.5.1"}

有关更多信息,请参阅文档 - https://docs.rs/sqlx/0.5.1/sqlx/postgres/struct.PgConnectOptions.html#method.password

希望对你有帮助。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...