我正在尝试在Postgres中创建一个自定义枚举类型,并且已经成功完成。我的迁移看起来像这样:
CREATE TYPE role AS ENUM ('admin', 'user');
ALTER TABLE users
ADD role role DEFAULT 'user';
然后我在Rust中创建了枚举类型,如下所示:
#[derive(Serialize, Deserialize, Debug, sqlx::Type)]
#[sqlx(type_name = "role", rename_all = "lowercase")]
pub enum Role {
ADMIN,
USER
}
我还改变了用户模型:
#[derive(sqlx::FromRow, Debug)]
pub struct User {
pub id: i32,
pub email: String,
pub username: String,
pub password: String,
pub role: Role,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
但是现在当我尝试像这样查询数据库时:
let user = match sqlx::query_as!(
User,
"SELECT * FROM users WHERE email = $1 AND password = $2",
&email,
&password,
)
我得到这个错误:unsupported type role of column #7 ("role")
我做错了什么?
我试过玩宏观部分#[sqlx(type_name = "role", rename_all = "lowercase")]
,
但这似乎没有帮助。
以下是cargo check
的完整错误:
error: unsupported type role of column #7 ("role")
--> src/routes/auth/mod.rs:140:20
|
140 | let user = match sqlx::query_as!(
| __________________________^
141 | | User,
142 | | "SELECT * FROM users WHERE email = $1 AND password = $2",
143 | | &payload.email,
144 | | &hash,
145 | | )
| |_________^
|
= note: this error originates in the macro `$crate::sqlx_macros::expand_query` which comes from the expansion of the macro `sqlx::query_as` (in Nightly builds, run with -Z macro-backtrace for more info)
error: could not compile `rust-api-example` (bin "rust-api-example") due to previous error
1条答案
按热度按时间ipakzgxi1#
我目前的情况与你非常相似,你的问题实际上帮助解决了我的问题。在我的例子中,将
#[sqlx(type_name = "user_role")]
添加到我的枚举中解决了我的问题。我将发布我所有相关的代码,现在工作。希望这也能帮助解决你的问题。我相信你的问题与使用query_as宏有关。宏在自动Map自定义类型时有问题,因此当您SELECT * 时,它不知道如何Map结果。我不得不在我的sql查询中手动指定类型。
user_role AS "user_role!: UserRole
。我是postgres的新手,所以除了使用AS子句修复它之外,我不知道太多。这些帖子更详细:
https://github.com/launchbadge/sqlx/issues/235
https://users.rust-lang.org/t/sqlx-postgres-how-to-insert-a-enum-value/53044/2
以下是我的SQL表/类型:
这是我的模特
下面是我的insert函数: