rust once_cell的异步版本,或避免错误的方法[E0744]:`.await`不允许在`static`中使用?

pbpqsu0x  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(115)

我一直在使用once_cell做很多只需要做一次的工作,然后以只读全局的方式持久化。这很好,因为我不必传递这些东西。我想知道这样的东西是否允许用于db句柄/池?

static POOL: Pool<Postgres> = PgPoolOptions::new()
    .max_connections(5)
    .connect("postgres://postgres:password@localhost/test")
    .await
    .unwrap();

但是可惜的是,由于.await,这不起作用,

error[E0744]: `.await` is not allowed in a `static`
  --> src/main.rs:10:31

如果我尝试用once_cell Package ,我会得到

static POOL = Lazy::new(|| sqlx_rt::block_on(
  PgPoolOptions::new()
      .max_connections(5)
      .connect("postgres://postgres:password@localhost/test")
      .await
) );

这里有什么办法可以做我想做的事吗

lyr7nygr

lyr7nygr1#

时雄OnceCell(2021年4月12日发布的Tokio 1.5.0中增加)

时雄现在提供了一个异步OnceCell,tokio::sync::OnceCell!您可以使用Tokio OnceCell进行异步代码。

使用once_cell crate(2021年初答案)

once_cell crate并没有currently provide异步API。相反,你可以从main函数初始化static:

static POOL: OnceCell<String> = OnceCell::new();

#[rt::main]
async fn main() {
    let pg_pool = PgPoolOptions::new()
        .max_connections(5)
        .connect("postgres://postgres:password@localhost/test")
        .await
        .unwrap();
    POOL.set(pg_pool).unwrap();
}

相关问题