#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. Это все, что я действительно хотел знать. Я должен создать новую структуру, если мне нужны только некоторые поля. Я совершенно новичок в этом языке, поэтому некоторые концепции для меня совершенно новые. Я действительно благодарен вам.