有这样一个模块代码(用于处理数据库):
use tokio_postgres::{NoTls, Error};
pub async fn hello() -> Result<(), Error> {
//println!("hello() from db.rs");
// Connect to the database.
let (client, connection) =
tokio_postgres::connect("host=localhost user=postgres", NoTls).await?;
// The connection object performs the actual communication with the database,
// so spawn it off to run on its own.
tokio::spawn(async move {
if let Err(e) = connection.await {
eprintln!("connection error: {}", e);
}
});
// Now we can execute a simple statement that just returns its parameter.
let rows = client
.query("SELECT $1::TEXT", &[&"hello world"])
.await?;
println!("{:?}", rows);
// And then check that we got back the same string we sent over.
let value: &str = rows[0].get(0);
assert_eq!(value, "hello world");
Ok(())
}
问题:
这种情况下数据库访问应该怎么写?
(该指南没有说明这一点 - 或者我没有完全理解它。)
https://docs.rs/tokio-postgres/0.5.5/tokio_postgres/
这种情况下的机制将保护对数据库的访问从 sql 注入?
通常需要最简单的用例。
execute
作为第一个近似值,使用/执行普通查询很容易query
:Client::execute()
他们Client::query()
自己转义所有字符/引号等。对于某些情况,值得使用查询准备、流水线等,但执行单个查询是绝对正常的做法。您不应该直接使用 准备查询,
format!
然后使用Client::simple_query()
. 这威胁到相应的乐趣: