tokio-postgre и запрос к базе

Есть такой код модуля(для работы с базой данных):

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 иньекций?
Необходим самый простой пример использования в общем.


Ответы (1 шт):

Автор решения: Fat-Zer

joxi.ru/YmEgJPahMMWOlA суть следующая. есть таблица в базе - вопрос как обратится к ней и вытащить что то или наоборот положить туда + что бы это был правильный безопасный подход?

В первом приближении достаточно просто исполнять обычные запросы с помощью execute/query:

let num = client.execute( "INSERT INTO my_first_table (first_column, second_column) \
                           VALUES ($1, $2)",
                         &[&"mouse", &12] ).await?;

assert_eq!(num, 1);

let rows = client.query( "SELECT first_column, second_column  FROM my_first_table  \
                          WHERE first_column != $1",
                         &[&"Cheese"] ).await?;

for r in rows.iter() {
  let row: (&str, i64) = (r.get(0), r.get(1));
  println!("{} : {}", row.0, row.1);
}

Client::execute() и Client::query() сами экранируют все символы/кавычки и т.п. Для определённых ситуаций стоит использовать подготовку запросов, конвееризацию итп, но и исполнение одиночных запросов — абсолютно нормальная практика.


Не стоит напрямую подготавливать запрос с помощью format!, а затем исполнять его с помощью Client::simple_query(). Это грозит соответствующим весельем:

client.simple_query( format!("SELECT *  FROM my_first_table WHERE first_column != '{}'",
                             "Cheese'; DROP TABLE my_first_table; --" ));
→ Ссылка