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
是的!我找到了解决方案! 这是正确的查询语法:
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""#,