Как мне преобразовать временную метку PostgreSQL в строку?

#postgresql #rust

#postgresql #Ржавчина

Вопрос:

Я получаю эту ошибку при попытке восстановить данные из базы данных:

 thread 'main' panicked at 'error retrieving column 2: error deserializing column 2: cannot convert between the Rust type `alloc::string::String` and the Postgres type `timestamp`'
  

Структура БД:

 CREATE TABLE IF NOT EXISTS table_(
            id SERIAL PRIMARY KEY,
            data VARCHAR NOT NULL,
            date_saved TIMESTAMP
        )
  
 struct MyType{
    local_id: i32,
    data: String,
    date_saved: String
}

let records = client.query("SELECT id,data,date_saved FROM table_",amp;[])?;
let mut the_records : Vec<MyType> = vec![];
for record in records {
    let saved_data = MyType {
        local_id: record.get(0),
        data: record.get(1),
        date_saved: record.get(2),
    };
    println!("{:?}",saved_data.data);
    the_records.push(saved_data);
}
  

Ответ №1:

Я обнаружил, что преобразование между временной меткой Postgres и строкой невозможно в соответствии с https://docs.rs/postgres/0.17.5/postgres/types/trait .FromSql.html но нам нужно использовать std::time::SystemTime.

Таким образом, MyType будет:

 struct MyType{
    local_id: i32,
    data: String,
    date_saved: std::time::SystemTime
}
  

И я могу управлять временем оттуда.

Ответ №2:

Приведенный выше ответ хорош, но если вы хотите более быстрое решение (например, хотите просто распечатать на экране / войти и т.д.), Просто приведите временную метку к ТЕКСТУ в Postgres, и тогда rust не будет жаловаться.

Так, например, это привело бы к ОШИБКЕ:

 SELECT now(); -- Will throw error
  

Но это не

 SELECT now()::TEXT; -- Will work fine