有什么办法可以重用相同的结构,还是我需要在Rust中构建一个新的结构?

问题描述

我在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: &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(&statement,&[&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`")',

有什么方法可以重用相同的结构,还是我需要构建一个新的结构?

解决方法

其中有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,created_at,task_id,deleted_at  from tasks_users where task_id = $1 and deleted_at is null")

或者您可以创建具有匹配字段的自定义结构。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...