如何存储SQLite准备好的语句供以后使用?
现在我的代码使用
rusqlite sqlite bindings来打开数据库连接并在我的应用程序中执行一堆数据库操作,如下所示:
extern crate rusqlite; use rusqlite::SqliteConnection; struct MyAppState { db: SqliteConnection,// ... pretend there's other fields here ... } impl MyAppState { fn new() -> MyAppState { let db = SqliteConnection::open(":memory:").unwrap(); MyAppState { db: db } } fn query_some_info(&mut self,arg: i64) -> i64 { let mut stmt = self.db.prepare("SELECT ? + 1").unwrap(); let mut result_iter = stmt.query(&[&arg]).unwrap(); let result = result_iter.next().unwrap().unwrap().get(0); result } } fn main() { let mut app = MyAppState::new(); for i in range(0,100) { let result = app.query_some_info(i); println!("{}",result); } } 由于准备好的语句存在于局部变量中,这似乎在某种程度上忽略了准备语句的要点,因为每次调用函数并且局部变量产生时我必须重新准备它.理想情况下,我最多只准备一次所有语句,并在数据库连接期间将它们存储在MyAppState结构中. 然而,从 通常当借用检查员背叛我时,我的办法就是放弃堆栈纪律并放入一些Rc< RefCell< >>在这里和那里直到一切都解决了,但在这种情况下,在这两种类型中有一些生命周期,我不知道如何以一种安抚借用检查器的方式来表达它. 理想情况下,我想编写只在db打开时才准备语句的代码,或者在第一次使用它们时只准备它们一次,然后在db连接期间再也不会再调用prepare,而主要是保留rusqlite绑定的安全性,而不是针对sqlite3 C API编写代码或破坏抽象等等.我如何能? 事实上,你是对的,在Rust中兄弟参考是尴尬的.但是有一个很好的理由,它们不容易被所有权制度建模.在这种特殊情况下,我建议你拆分结构:你可以将准备好的语句保存在专用缓存中,也可以在db的生命周期中进行参数化;例如; db应该在程序的顶部实例化并传递下来(想想依赖注入),以便依赖它的缓存可以比程序主函数更长. 这显然意味着数据库显然会被借用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |