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}代码>在mymain.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");
}