есть ли какой-либо способ повторно использовать ту же структуру или мне нужно создать новую в Rust?

#rust #rust-actix #actix-web

#Ржавчина #rust-actix #actix-web

Вопрос:

Я получил эту таблицу в postgres

 create table tasks_users(
  id serial primary key,
  user_id smallint,
  task_id integer,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
  deleted_at TIMESTAMP WITH TIME ZONE
)
  

С помощью этого

 table_name   | column_name |        data_type
------------- ------------- --------------------------
 tasks_users | id          | integer
 tasks_users | user_id     | smallint
 tasks_users | task_id     | integer
 tasks_users | created_at  | timestamp with time zone
 tasks_users | deleted_at  | timestamp with time zone
  

Я получил эту структуру

 #[derive(Serialize, Deserialize, Queryable, PostgresMapper)]
#[pg_mapper(table = "tasks_users")]
pub struct TaskUsers {
    pub id: i32,
    pub user_id: i16,
    pub task_id: Option<i32>,
    pub created_at: DateTime<Utc>,
    pub deleted_at: Option<DateTime<Utc>>,
}
  

и я делаю запрос с помощью этого:

 pub async fn get_users_by_tasks(
    client: amp;Client,
    task_id: i32,
) -> Result<Vec<TaskUsers>, io::Error> {
    let statement = client
        .prepare("select id, user_id, created_at from tasks_users where task_id = $1 and deleted_at is null")
        .await
        .unwrap();

    let usuarios = client
        .query(amp;statement, amp;[amp;task_id])
        .await
        .expect("Hubo un error al recuperar los usuarios de una tarea")
        .iter()
        .map(|row| TaskUsers::from_row_ref(row).unwrap())
        .collect::<Vec<TaskUsers>>();

    Ok(usuarios)
}
  

Но, когда я получаю эту ошибку

 thread 'actix-rt:worker:0' panicked at 'called `Result::unwrap()` on an `Err` value: UnknownTokioPG("invalid column `task_id`")',
  

есть ли какой-либо способ повторно использовать ту же структуру или мне нужно создать новую?

Комментарии:

1. Почему создание новой структуры решило бы проблему… что бы это ни было на самом деле?

2. если я создаю структуру только с помощью id , user_id и created_at , ошибка больше не отображается.

3. Не могли бы вы, пожалуйста, обновить вопрос выводом ` ВЫБЕРИТЕ имя_таблицы, имя_колонок_типа данных ИЗ information_schema.columns ГДЕ имя_таблицы = ‘tasks_users’; `

4. @MaxV я вставил create table из postgres, это помогает?

5. @Dilakv, не хотели бы вы попробовать использовать «выбрать * из»? Я предполагаю, что основная причина в TaskUsers::from_row_ref(row).unwrap() : ваш оператор select не содержит столбец «task_id». Другое возможное решение — заменить все unwrap на expect другими сообщениями. Это должно помочь локализовать проблему.

Ответ №1:

Есть детали реализации для производной PostgresMapper https://docs.rs/postgres-mapper-derive/0.1.1/src/postgres_mapper_derive/lib.rs.html#120 (похоже, репозиторий github на данный момент недоступен).

Реализация требует, чтобы все поля были представлены в предоставленной строке.

В качестве возможного решения вы можете выбрать все необходимые столбцы из таблицы:

 --- .prepare("select id, user_id, created_at from tasks_users where task_id = $1 and deleted_at is null")
    .prepare("select id, user_id, created_at, task_id, deleted_at  from tasks_users where task_id = $1 and deleted_at is null")
  

или вы можете создать пользовательскую структуру с соответствующими полями.

Комментарии:

1. Это все, что я действительно хотел знать. Я должен создать новую структуру, если мне нужны только некоторые поля. Я совершенно новичок в этом языке, поэтому некоторые концепции для меня совершенно новые. Я действительно благодарен вам.