如何使用 Diesel 的主键以外的列找到值?

Posted

技术标签:

【中文标题】如何使用 Diesel 的主键以外的列找到值?【英文标题】:How could I find a value using a column other than the primary key with Diesel? 【发布时间】:2021-04-19 18:12:00 【问题描述】:

我有一个用户表,并希望使用 Diesel 执行搜索,以确保该用户名尚未被使用。我发现执行查询的唯一方法是使用find() 函数,它使用主键。有没有类似SELECT * FROM users WHERE username = foo的使用其他字段搜索的功能?

这是我的用户表:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE users (
    user_id uuid PRIMARY KEY DEFAULT uuid_generate_v4() NOT NULL UNIQUE,
    username VARCHAR(255) NOT NULL UNIQUE,
    password VARCHAR(60) NOT NULL
);

这是我正在使用的 Rust 结构:

#[derive(Queryable, AsChangeset, Deserialize, Serialize)]
#[table_name = "users"]
pub struct User 
    pub user_id: uuid::Uuid,
    pub username: String,
    pub password: String,


#[derive(Insertable, Deserialize, Serialize)]
#[table_name = "users"]
pub struct InsertableUser 
    pub username: String,
    pub password: String,

【问题讨论】:

你可以使用filter 【参考方案1】:

Diesel 提供了一个通用的.filter 方法,让您可以构建任意复杂的 where 子句。 对于您的示例查询,您可以查找以下内容:

users::table.filter(users::username.eq("foo"))

【讨论】:

以上是关于如何使用 Diesel 的主键以外的列找到值?的主要内容,如果未能解决你的问题,请参考以下文章

不能将 UUID 用作主键:Uuid:diesel::Expression 不满足 [重复]

Mysql:如何使物化视图中的列成为主键

如何使每个表中的主键值应从数字一(1)开始 - PostgreSQL,Spring data jpa

如何在插入新行后立即将自动生成的主键值保存到第二列

oracle的主键要设置默认值为自动递增,怎么处理?

如何使用 Diesel 和 SQLite 获取新创建值的 id?