"expected struct String, found struct schema::my_table::columns::my_column" 尝试使用 Diesel 插入值时

"expected struct String, found struct schema::my_table::columns::my_column" when trying to insert value with Diesel

我正在尝试使用 Diesel 和 PostgreSQL 执行插入多列。

这是添加新的插入函数Project -

pub fn insert(project: NewProject, program_id: i32, conn: &PgConnection) -> bool {
    use schema::projects::dsl::*;
    use schema::projects::dsl::{title as t};
    use schema::projects::dsl::{program_id as prog_id};

    let NewProject {
        title
    } = project;

    diesel::insert_into(projects)
        .values((t.eq(title), prog_id.eq(program_id)))
        .execute(conn)
        .is_ok()
}

ProjectNewProject

#[derive(Queryable, Serialize, Debug, Clone)]
pub struct Project {
    pub id: i32,
    pub title: String,
    pub program_id: i32,
    pub is_archived: bool
}

#[derive(Serialize, Deserialize, Insertable)]
#[table_name = "projects"]
pub struct NewProject {
    pub title: String
}

项目 table 看起来像这样 -

CREATE TABLE projects (
    id SERIAL PRIMARY KEY,
    title VARCHAR NOT NULL,
    program_id INTEGER NOT NULL REFERENCES programs (id),
    is_archived BOOLEAN NOT NULL DEFAULT FALSE
);

和 schema.rs -

table! {
projects (id) {
    id -> Int4,
    title -> Varchar,
    program_id -> Int4,
    is_archived -> Bool,
}

编译时我收到一条错误消息 -

title | ^^^^^ expected struct std::string::String, found struct schema::projects::columns::title

.execute(conn) | ^^^^^^^ expected struct diesel::query_source::Never, found struct diesel::query_source::Once

我这样做时没有出现编译错误

.values(&project)

改为在插入函数中。

这是MCVE你的问题:

#[macro_use]
extern crate diesel;

use diesel::pg::PgConnection;
use diesel::prelude::*;

mod schema {
    table! {
        projects (id) {
            id -> Int4,
            title -> Varchar,
            program_id -> Int4,
            is_archived -> Bool,
        }
    }

    #[derive(Debug, Insertable)]
    #[table_name = "projects"]
    pub struct NewProject {
        pub title: String,
    }
}

use schema::NewProject;

fn insert(project: NewProject, program_id: i32, conn: &PgConnection) -> bool {
    use schema::projects::dsl::*;
    use schema::projects::dsl::{title as t};
    use schema::projects::dsl::{program_id as prog_id};

    let NewProject {
        title
    } = project;

    diesel::insert_into(projects)
        .values((t.eq(title), prog_id.eq(program_id)))
        .execute(conn)
        .is_ok()
}

fn main() {}

您导入了一个名为 title 的类型,它与解构冲突,如错误消息所述:

error[E0308]: mismatched types
  --> src/main.rs:34:22
   |
34 |     let NewProject { title } = project;
   |                      ^^^^^ expected struct `std::string::String`, found struct `schema::projects::columns::title`
   |
   = note: expected type `std::string::String`
              found type `schema::projects::columns::title`

这可以简化为一个非常小的案例:

struct foo;
struct Thing { foo: String }

fn example(t: Thing) {
    let Thing { foo } = t;
}
error[E0308]: mismatched types
 --> src/lib.rs:5:17
  |
5 |     let Thing { foo } = t;
  |                 ^^^ expected struct `std::string::String`, found struct `foo`
  |
  = note: expected type `std::string::String`
             found type `foo`

请注意,此结构的定义没有花括号,这使它成为一个 类单元结构 。这些很方便,但它们有细微差别,它们创建了 typevalue:

struct foo;

fn example() {
    let foo: foo = foo;
    //             ^-- the only value of the type `foo`
    //       ^-------- the type `foo`
    //  ^------------- newly-defined unrelated identifier
}

解构时,模式首选 类型,而不是标识符。

不要导入该类型,这样就不会发生冲突:

fn insert(project: NewProject, program_id: i32, conn: &PgConnection) -> bool {
    use schema::projects::dsl;

    let NewProject { title } = project;

    diesel::insert_into(dsl::projects)
        .values((dsl::title.eq(title), dsl::program_id.eq(program_id)))
        .execute(conn)
        .is_ok()
}