1

我一直在once_cell做很多只需要完成一次的工作,然后作为只读全局持久化。这很好,因为我不必传递这些东西。我想知道数据库句柄/池是否允许这样的事情?

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,我会得到

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

无论如何在这里做我想做的事

4

1 回答 1

2

once_cell目前不提供异步 API。相反,您可以从 main 函数初始化静态:

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();
}
于 2021-04-22T13:32:22.890 回答