You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Diesel的#[primarykey()]宏遇编译器未知错误,添加feature无效求助

解决Diesel中#[primary_key]宏未知的问题

看起来你在Diesel ORM的主键定义上踩了个小坑,我来帮你捋清楚问题出在哪:

首先,纠正两个常见误区

  1. 宏名写错了:你用的#[primarykey()]是错误写法,正确的宏是#[primary_key](注意下划线,单字段主键不需要加括号,复合主键才需要在括号里指定字段)。
  2. 不需要启用不稳定feature:#![feature(primary_key)]是Diesel早期依赖Rust nightly版本的用法,现在Diesel 1.0+的稳定版已经完全移除了这个特性依赖,启用它反而会因为该feature已被废弃而无效。

正确的主键定义方式

根据你的场景分两种情况处理:

1. 单字段主键(最常见)

如果你的表主键是单个字段,根本不需要额外的#[primary_key]宏——只要在schema.rs的table!定义里指定主键,然后在models结构体上派生对应trait即可:

schema.rs(Diesel CLI自动生成时会帮你配置好主键):

table! {
    users (id) {  // 这里的`(id)`就是指定id为主键
        id -> Int4,
        name -> Varchar,
        email -> Varchar,
    }
}

models.rs:

use super::schema::users;

#[derive(Queryable, Debug)]
pub struct User {
    pub id: i32,
    pub name: String,
    pub email: String,
}

2. 复合主键(多个字段共同作为主键)

如果是多个字段组成的复合主键,才需要用到#[primary_key]宏,并且要在宏内列出所有主键字段:

models.rs:

use super::schema::user_roles;
use diesel::primary_key;

#[derive(Queryable, Debug)]
#[primary_key(user_id, role_id)]  // 指定两个字段作为复合主键
pub struct UserRole {
    pub user_id: i32,
    pub role_id: i32,
    pub assigned_at: chrono::NaiveDateTime,
}

检查你的Cargo.toml配置

确保Diesel依赖是稳定版,并且启用了对应数据库的feature(比如PostgreSQL):

[dependencies]
diesel = { version = "2.0", features = ["postgres", "chrono"] }
dotenv = "0.15"

调整你的lib.rs代码

Diesel 2.0+已经不需要#[macro_use] extern crate diesel;这句了,用use diesel::prelude::*;就能导入必要的宏和trait。调整后的代码示例:

extern crate dotenv;

pub mod schema;
pub mod models;

use diesel::prelude::*;
use diesel::pg::PgConnection;
use dotenv::dotenv;
use std::env;

pub fn establish_connection() -> PgConnection {
    dotenv().ok();
    let database_url = env::var("DATABASE_URL")
        .expect("DATABASE_URL must be set in .env file");
    PgConnection::establish(&database_url)
        .expect(&format!("Error connecting to {}", database_url))
}

按照上面的步骤调整后,编译器应该就不会再报#[primary_key]宏未知的错误啦。

内容的提问来源于stack exchange,提问作者crash springfield

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:32:31