내 프로그램은 rusqlite를 사용하여 다른 데이터 소스에서 데이터베이스를 빌드합니다. 데이터베이스는 같은 방식으로 여러 테이블을 구축, 그래서 내가 재사용 가능한 기능은 그렇게 할 수 있도록 거라고 생각 :컴파일 된 SQL 문에서 문제 생기기
fn download_generic<Inserter>(table_name: &str,
connection: &mut rusqlite::Connection,
inserter: &mut Inserter)
-> Result<(), String>
where Inserter: FnMut(&str, &json::JsonValue) ->()
{}
inserter
가 이전에 준비된 문장에서 올바른 값을 결합하여 삽입을 수행하는 기능입니다 .
나는 다음과 같이 호출 : 그것은 이미 insert_stmt
에 의해 차용되고 있기 때문에
let mut insert_stmt = connection
.prepare("insert or replace into categories values(?,?);")
.unwrap();
download_generic("categories",
&mut connection,
&mut |uuid, jsonproperties| {
insert_stmt.execute(&[&uuid, &jsonproperties["name"].as_str().unwrap_or("")]);
});
그러나 나는
download_generic
에
&mut connection
를 전달할 수 없습니다.
RefCell
에 넣으면이 작업을 수행하기 위해 런타임 오버 헤드가 필요하지 않으므로 이해가되지 않습니다.
람다가 download_generic
으로 전달한 insert_stmt
을 만들려고 시도해 볼 수는 있지만, 평생 마커를 사방에 추가해야하므로 부담 스럽습니다. 어쨌든 부 자연스럽게 보입니다.
'RefCell'에 넣으면 작동하지 않습니다 :'RefCell'은 컴파일 타임 대신 런타임에 간단히 검사하지만 동일한 근본 검사는 => ** Aliasing XOR Mutability **로 수행됩니다. 분명한 질문은 : 똑같은 연결을 빌릴 수는 없습니까? 필요한 하나의 빌림이 변경 가능하면 운이 없어진 것입니다. –
'download_generic'이 그것을 유지할 수 있도록 어떻게 든 lambda에 insert_stmt를 옮길 수는 없습니까? – njaard
'prepare' 대신'prepare_cached'를 사용하여 클로저 내에서 준비된 문장을 얻을 수 있습니까? 상충되는 borrow를 피하기 위해서 클로저에'connection'을 명시 적으로 전달해야합니다. –