Rust 柴油机';编译器当前未知的属性'primary_key'

Rust 柴油机';编译器当前未知的属性'primary_key',rust,rust-diesel,Rust,Rust Diesel,我试图在Diesel中使用#[primarykey()]宏,但出现未知错误。根据我的发现,添加#![feature(primary_key)]应该可以解决这个问题,但事实并非如此 lib.rs #[macro_use] extern crate diesel; extern crate dotenv; pub mod schema; pub mod models; use diesel::prelude::*; use diesel::pg::PgConnection; use dotenv

我试图在Diesel中使用
#[primarykey()]
宏,但出现未知错误。根据我的发现,添加
#![feature(primary_key)]
应该可以解决这个问题,但事实并非如此

lib.rs

#[macro_use]
extern crate diesel;
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");
    PgConnection::establish(&database_url)
        .expect(&format!("Error connecting to {}", database_url))
}
#![feature(primary_key)]

extern crate diesel;

#[derive(Queryable, Debug)]
#[primary_key(user_id)]
pub struct User {
    pub user_id: i32,
    pub email: String,
    pub password: String,
    pub bio: String,
    pub verified: bool,
}
型号.rs

#[macro_use]
extern crate diesel;
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");
    PgConnection::establish(&database_url)
        .expect(&format!("Error connecting to {}", database_url))
}
#![feature(primary_key)]

extern crate diesel;

#[derive(Queryable, Debug)]
#[primary_key(user_id)]
pub struct User {
    pub user_id: i32,
    pub email: String,
    pub password: String,
    pub bio: String,
    pub verified: bool,
}
我还尝试添加了
#![feature(primary_key)]
lib.rs
的顶部,没有任何运气


每晚使用Rust 1.26.0(80785a547 2018-03-30)

只有在导出可识别的
时,
主键
属性才适用:

#[macro_use]
extern crate diesel;

mod schema {
    table! {
        users (user_id) {
            user_id -> Int4,
            email -> Text,
        }
    }

    #[derive(Debug, Identifiable)]
    #[primary_key(email)]
    pub struct User {
        pub user_id: i32,
        pub email: String,
    }
}

fn main() {}

我相信您也可以在模式定义中更改主键(
users(user\u id)
)。

这很有效。注意,未来会发现这个问题/答案的人:因为我的模式和模型在两个不同的文件中,所以我必须添加
use schema::{users}添加到models.rs的顶部以进行编译。在我的架构定义中添加主键会有相同的效果吗?这两种方法是否存在差异?@crashspringfield您能建议我如何澄清答案中的陈述吗?我认为这已经解决了您的评论:我相信您也可以更改模式定义中的主键(
users(user\u id)
)?当然可以。所以我得到schema.rs是从models.rs生成的。#[主键(用户id)]是否生成主键为
user\u id
而不是
id
的架构?我一直在手动更新我的模式,以表示我对模型所做的更改,所以这可能是我产生混淆的地方。@crashspringfield我得到的schema.rs是从models.rs生成的-它不是。通常,Rust代码中的模式定义反映了数据库的模式。在我的回答中,这是
宏,它只是“硬编码”到源代码中。您的结构从属于模式。