rust sea-orm的一些使用方法

示例代碼來(lái)自https://github.com/easynet-cn/batata,本人的一個(gè)想兼容nacos(https://github.com/alibaba/nacos)rust項(xiàng)目。其中數(shù)據(jù)entity是使用sea-orm cli生成,具體可以參考文檔https://www.sea-ql.org/SeaORM/docs/next/generate-entity/sea-orm-cli/

構(gòu)造數(shù)據(jù)庫(kù)鏈接池,鏈接池配置類似HikariCP(https://github.com/brettwooldridge/HikariCP

   let settings = Config::builder()
        .add_source(config::File::with_name("conf/application.yml"))
        .build()
        .unwrap();

    let db_num = settings.get_int("db.num").unwrap();
    let mut conns: Vec<DatabaseConnection> = Vec::new();

    let max_connections = settings
        .get_int("db.pool.config.maximumPoolSize")
        .unwrap_or(100) as u32;
    let min_connections = settings
        .get_int("db.pool.config.minimumPoolSize")
        .unwrap_or(1) as u32;
    let connect_timeout = settings
        .get_int("db.pool.config.connectionTimeout")
        .unwrap_or(30) as u64;
    let acquire_timeout = settings
        .get_int("db.pool.config.initializationFailTimeout")
        .unwrap_or(1) as u64;
    let idle_timeout = settings.get_int("db.pool.config.idleTimeout").unwrap_or(10) as u64;
    let max_lifetime = settings.get_int("db.pool.config.maxLifetime").unwrap_or(30) as u64;

    for i in 0..db_num {
        let url = &settings
            .get_string(format!("db.url.{}", i).as_str())
            .unwrap();

        let mut opt = ConnectOptions::new(url);

        opt.max_connections(max_connections)
            .min_connections(min_connections)
            .connect_timeout(Duration::from_secs(connect_timeout))
            .acquire_timeout(Duration::from_secs(acquire_timeout))
            .idle_timeout(Duration::from_secs(idle_timeout))
            .max_lifetime(Duration::from_secs(max_lifetime))
            .sqlx_logging(true)
            .sqlx_logging_level(log::LevelFilter::Info);

        let db = Database::connect(opt).await.unwrap();

        conns.push(db);
    }

條件查詢,示例為查詢所有namespace

        let tenant_infos: Vec<tenant_info::Model> = tenant_info::Entity::find()
            .filter(tenant_info::Column::Kp.eq(NamespaceOperationService::DEFAULT_KP))
            .all(db)
            .await
            .unwrap();

in查詢,示例為根據(jù)namespace ID集合,查詢配置數(shù)量

#[derive(Debug, FromQueryResult)]
        struct SelectResult {
            tenant_id: Option<String>,
            count: i32,
        }

        let mut config_infos = config_info::Entity::find()
            .select_only()
            .column(config_info::Column::TenantId)
            .column_as(config_info::Column::Id.count(), "count")
            .filter(config_info::Column::TenantId.is_in(tenant_ids))
            .filter(config_info::Column::TenantId.is_not_null())
            .group_by(config_info::Column::TenantId)
            .into_model::<SelectResult>()
            .all(db)
            .await
            .unwrap()
            .iter()
            .map(|x| (x.tenant_id.clone().unwrap_or_default(), x.count))
            .collect::<HashMap<String, i32>>();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容