Skip to main content

ensure_database

Function ensure_database 

Source
pub async fn ensure_database() -> Result<(), String>
Expand description

启动期自举:连接 postgres 维护库,确保目标数据库存在(不存在则创建)。

解决“全新部署没有目标库“的缺口——get_conn_for_startup 连的是 DATABASE_URL 里指定的目标库,库不存在时只会反复重试到超时退出。本函数在连接池首次被触碰 之前运行,把 scripts/migrate.sh 里那段 CREATE DATABASE 逻辑内置进二进制, 让首次启动真正零手动。

get_conn_for_startup 共享同一套语义:

  • 复用 MIGRATE_STARTUP_TIMEOUT_SECS 窗口(默认 30s)应对“DB 起得比 app 慢“;
  • 固定 500ms 轮询连接 postgres 维护库;连上后 EXISTS 查询 + CREATE 只跑一次。
  • 目标库已存在是常态,此时仅一次快速往返。

返回 Result<(), String>(而非 MigrateError),与 validate_database_url 的 报错风格一致,便于 main.rs 走统一的 tracing::error! + exit(1) 路径。

跳过自动创建(返回 Ok(()))的安全场景:

  • 目标库名无法从 URL/用户名推断;
  • 目标库名不是简单标识符(含 -、引号等),避免拼到 CREATE DATABASE 后面 产生 SQL 注入风险——此时把“库不存在“的错误留给后续正常连接路径去报告。