如何从一个mysql :: Conn创建多个预准备语句?

时间:2018-03-19 17:48:08

标签: mysql rust

此代码

extern crate mysql;
use mysql::*;

fn main () {
    let mut conn = Conn::new("mysql://root:password@127.0.0.1:3306/mydb?prefer_socket=false").unwrap();
    let _q1 = conn.prepare("some query").unwrap();
    let _q2 = conn.prepare("some query 2").unwrap();
}

产生错误:

error[E0499]: cannot borrow ``conn`` as mutable more than once at a time
 --> src\bin\test.rs:8:12
  |
7 |  let _q1 = conn.prepare("some query").unwrap();
  |            ---- first mutable borrow occurs here
8 |  let _q2 = conn.prepare("some query 2").unwrap();
  |            ^^^^ second mutable borrow occurs here
9 | }
  | - first borrow ends here

我认为第一次借用直到第9行,因为conn.prepare(...).unwrap()的结果是StmtStmt被声明为

pub struct Stmt<'a> {
    stmt: InnerStmt,
    conn: ConnRef<'a>,
}

ConnRef被声明为

enum ConnRef<'a> {
    ViaConnRef(&'a mut Conn), // It keeps mutable borrow as long as lifetime of connection?
    ViaPooledConn(pool::PooledConn),
}

所以_q1保持可变借用,直到conn死亡。

如何在不产生编译时错误的情况下创建多个预准备语句?

1 个答案:

答案 0 :(得分:0)

documentation确实声明:

  

Stmt将借用Conn直到其范围结束。

Github issue建议使用prep_exec,声称:

  

由于快速的基于xxhash的语句缓存,开销可以忽略不计。

相关问题