使用Diesel的#[primarykey()]宏遇编译器未知错误,添加feature无效求助
解决Diesel中
#[primary_key]宏未知的问题 看起来你在Diesel ORM的主键定义上踩了个小坑,我来帮你捋清楚问题出在哪:
首先,纠正两个常见误区
- 宏名写错了:你用的
#[primarykey()]是错误写法,正确的宏是#[primary_key](注意下划线,单字段主键不需要加括号,复合主键才需要在括号里指定字段)。 - 不需要启用不稳定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
相关产品推荐
相关产品推荐

