不支持的类型 |生锈| postgres | sqlx |更新 |枚举 |自定义类型

问题描述 投票:0回答:1
async fn update_user<T: Into<String> + Send>(
    &self,
    user_id: Option<Uuid>,
    role: T,
) -> Result<Option<UserModel>, Error> {
    let now = chrono::Utc::now();

    if let Some(user_id) = user_id {
        let existing_user = sqlx::query_as!(
            UserModel,
            r#"SELECT id,name,email,password,verified,created_at,updated_at,role as "role: UserRole" FROM users WHERE id = $1"#,
            user_id
            )
        .fetch_optional(&self.pool)
        .await?;

        if existing_user.is_none() {
            return Err(Error::RowNotFound);
        }

        let updated_user = sqlx::query_as!(
            UserModel,
            r#"UPDATE users SET role=$1,updated_at=$2 WHERE id=$3 RETURNING id,name,email,verified,created_at,password,updated_at,role as "role: UserRole""#,
            role.into(),
            now,
            user_id,
        )
        .fetch_optional(&self.pool)
        .await?;

        return Ok(updated_user);
    }

    Err(sqlx::Error::RowNotFound)
}

in

existing_user
- 一切都好。我所有的问题都在
updated_user
。 我有迁移

CREATE TYPE user_role AS ENUM ('admin', 'moderator', 'user');

CREATE TABLE "users" (
    id UUID NOT NULL PRIMARY KEY DEFAULT (uuid_generate_v4()),
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    verified BOOLEAN NOT NULL DEFAULT FALSE,
    password VARCHAR(100) NOT NULL,
    role user_role NOT NULL DEFAULT 'user',
    created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

我明白在

update_user
中我必须写一些类似
...SET role=$1 as "role: UserRole"...
的东西,但是怎么写??? 我已经尝试过许多不同的变体。

我认为语法有问题

我试过了

r#"UPDATE users SET role=$1,updated_at=$2 WHERE id=$3 RETURNING id,name,email,verified,created_at,password,updated_at,role as "role: UserRole""#

还有这个

r#"UPDATE users SET role as "role:UserRole"=$1,updated_at=$2 WHERE id=$3 RETURNING id,name,email,verified,created_at,password,updated_at,role as "role: UserRole""#

还有这个

r#"UPDATE users SET role=$1,updated_at=$2 role as "role:UserRole" WHERE id=$3 RETURNING id,name,email,verified,created_at,password,updated_at,role as "role: UserRole""#

还有许多其他

这里在github上https://github.com/launchbadge/sqlx/discussions/3044

postgresql enums sqlx rust-sqlx custom-type
1个回答
0
投票

是的!我找到了解决方案! 这是正确的查询语法:

r#"UPDATE users SET role=($1::text)::user_role, updated_at=$2 WHERE id=$3 RETURNING id, name, email, verified, created_at, password, updated_at, role as "role:UserRole""#,
© www.soinside.com 2019 - 2024. All rights reserved.