Rust 如何选择查询';锈和镍的结果如何?

Rust 如何选择查询';锈和镍的结果如何?,rust,nickel,Rust,Nickel,我使用镍币。卢比: router.get("/api/movies", middleware! { |request, response| let mut test_movies = r#"[ { "title": "Ironman"}, { "title": "The Walk"}, { "title": "Paddington"} ] "#; let json = Json::from_str(test_

我使用镍币。卢比:

router.get("/api/movies", middleware! { |request, response|
    let mut test_movies =
    r#"[
        { "title": "Ironman"},
        { "title": "The Walk"},
        { "title": "Paddington"}
    ]
    "#;
    let json = Json::from_str(test_movies);
    format!("{}", json.unwrap())
});
我想创建JSON格式。连接到PostgreSQL并转换为JSON定义的代码如下:

extern crate rustc_serialize;
use rustc_serialize::json::{Json, Parser};

#[derive(RustcDecodable, RustcEncodable)]
struct Movie {
    title: String,
}
我尝试选择query并创建JSON

router.get("/api/movies", middleware! { |request, response|
    let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
    let stmt = match conn.prepare("select title from movie") {
        Ok(stmt) => stmt,
        Err(e) => {
            return response.send(format!("Preparing query failed: {}", e));
        }
    };
    let res = match stmt.execute(&[]) {
        Ok(v) => println!("Selecting movie was Success."),
        Err(e) => println!("Selecting movie failed. => {:?}", e)
    };

    // ???
    // let movies = Json::from_obj(res);
    // let movies = request.json_as::<&[Movie]>().unwrap();
    // let movies = request.json_as::Vec<Movie>().unwrap();
    format!("{}", movies)
});
犯错误

error: no method named `clone` found for type `postgres::Connection` in the current scope
我补充说

use nickel::status::StatusCode;

//use rustc_serialize::json::{Json, Parser};
use rustc_serialize::{json};

json::encode(&movies).unwrap();
是工作。但是null返回了

最后

我将
execute
更改为
query
,并使用
Vec

嗯。。很麻烦

但是,我还不能
conn.clone()

请尝试以下操作:

    let json = json::encode(&res).unwrap();
    response.set(MediaType::Json);
    response.set(StatusCode::Ok);
    return response.send(json);
此外,为每个请求创建一个新的连接也不是很有效。您可以在main()函数中创建一个连接,然后在每个请求闭包中克隆它

fn main(){

    let mut server = Nickel::new();
    let mut router = Nickel::router();

    let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
    let shared_connection = Arc::new(conn);


    {
        let conn = shared_connection.clone();
        router.get("/api/movies", middleware! ( |request, mut response|{

            let mut v: Vec<Movie> = vec![];
            let movies = &conn.query("select title", &[]).unwrap();
            for row in movies {
                let movie = Movie {
                    title: row.get(0),
                };

                v.push(movie);
            }

            let json_obj = json::encode(&v).unwrap();
            res.set(MediaType::Json);
            res.set(StatusCode::Ok);
            return res.send(json_obj);

        }));
    }

    {
        let conn = shared_connection.clone();
        router.post("/api/movies",middleware!(|request, mut response|{

            //...

        }));
    }

    server.utilize(router);
    server.listen("127.0.0.1:6767");
}
fn main(){
让mut server=nikel::new();
让mut router=nicle::router();
让conn=Connection::connect(“postgres://postgres@localhost”,SslMode::None).unwrap();
让共享连接=Arc::新建(conn);
{
让conn=shared_connection.clone();
路由器.get(“/api/movies”),中间件!(|请求,mut响应|{
让mut v:Vec=Vec![];
让movies=&conn.query(“选择标题”&[]).unwrap();
电影中的争吵{
让电影=电影{
标题:row.get(0),
};
v、 推送(电影);
}
让json_obj=json::encode(&v).unwrap();
res.set(MediaType::Json);
res.set(状态码::Ok);
返回res.send(json_obj);
}));
}
{
让conn=shared_connection.clone();
router.post(“/api/movies”),中间件!(|请求,mut响应|{
//...
}));
}
利用服务器(路由器);
监听(“127.0.0.1:6767”);
}

你试过
json::encode(&movies).unwrap()
吗?我错了。所以我改变了代码,使用rustc_序列化:{json};它成功了。但是,请看一看我的最新答案,以解决克隆问题。这是一个类似的问题。同样的警告。但我无法修复,谢谢你的回复。对我认为为每个请求建立新连接是不好的。我试着让conn=conn.clone();错误:在当前作用域中找不到类型为
postgres::Connection
的名为
clone
的方法发生错误。我添加了use Nikel::status::StatusCode;并且,我修复了使用rustc_serialize::json::{json,Parser};要使用rustc_序列化::{json};我把res改成电影。你的代码没有错误。但是,返回null。我当然把数据联系起来了。为什么会这样?选择电影是成功的。日志显示。所以,我想SQL是正确的。谢谢你指出我答案中的不一致之处。我将更新它以匹配您的原始代码。您是否正在使用库
sfackler/rust postgres
?如果是这样,它的文档说明
execute()
返回受影响的行数,而
query()
返回一个iterable对象。因此,我建议您尝试使用
query()
。是的。我在
Cargo.toml
中编写了
postgres=“0.11”
[dependencies]
。我写了
usepostgres::{Connection,SslMode}在my
main.rs
中。那么,有很多LIB?我还编写了
use nickel_postgres::{postgresimddleware,PostgresRequestExtensions}。。。但是它没有被使用。很抱歉,我忘记为连接初始化原子引用计数
Arc
。您现在应该可以
clone()
struct Movie {
    // id: i32,
    title: String,
}
    let json = json::encode(&res).unwrap();
    response.set(MediaType::Json);
    response.set(StatusCode::Ok);
    return response.send(json);
fn main(){

    let mut server = Nickel::new();
    let mut router = Nickel::router();

    let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
    let shared_connection = Arc::new(conn);


    {
        let conn = shared_connection.clone();
        router.get("/api/movies", middleware! ( |request, mut response|{

            let mut v: Vec<Movie> = vec![];
            let movies = &conn.query("select title", &[]).unwrap();
            for row in movies {
                let movie = Movie {
                    title: row.get(0),
                };

                v.push(movie);
            }

            let json_obj = json::encode(&v).unwrap();
            res.set(MediaType::Json);
            res.set(StatusCode::Ok);
            return res.send(json_obj);

        }));
    }

    {
        let conn = shared_connection.clone();
        router.post("/api/movies",middleware!(|request, mut response|{

            //...

        }));
    }

    server.utilize(router);
    server.listen("127.0.0.1:6767");
}