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 注入风险——此时把“库不存在“的错误留给后续正常连接路径去报告。