示例代碼來自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ù)庫鏈接池周霉,鏈接池配置類似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>>();