use std::sync::OnceLock; use std::time::Duration; use sea_orm::{ConnectOptions, Database, DatabaseConnection}; use crate::core::config::Config; static DB: OnceLock = OnceLock::new(); pub async fn init_database(config: &Config) { let db_cfg = &config.database; let mut conn_option = ConnectOptions::new(&db_cfg.url); conn_option.min_connections(db_cfg.options.min_conns) .max_connections(db_cfg.options.max_conns) .connect_timeout(Duration::from_secs(db_cfg.options.conn_timeout)) .idle_timeout(Duration::from_secs(db_cfg.options.idle_timeout)) .max_lifetime(Duration::from_secs(db_cfg.options.max_lifetime)) .sqlx_logging(db_cfg.options.sql_logging); let conn = Database::connect(conn_option) .await .unwrap_or_else(|e| panic!("数据库连接失败:{}", e)); let _ = conn .ping() .await .is_err_and(|e| panic!("数据库连接失败:{}", e)); let _ = DB.set(conn); } pub fn conn() -> &'static DatabaseConnection { DB.get().unwrap_or_else(|| panic!("数据库连接未初始化")) } #[macro_export] macro_rules! db { () => { library::core::db::conn() }; }