14

我正在尝试使用Diesel和 PostgreSQL 执行插入或更新。

我努力了:

diesel::insert_into($table::table).values(&objects).on_conflict($table::id).do_update().set(&objects).execute(conn).unwrap();

哪里objectsstd::vec::Vec<Struct>- 导致编译器错误:

^^^ the trait 'diesel::query_builder::AsChangeset' is not implemented for '&std::vec::Vec<Struct>'

查询生成器中有一个on_conflict_do_nothing(),但我似乎找不到类似on_conflict_do_update()or的东西on_conflict_do_replace()

4

2 回答 2

27

Diesel 1.3.3 的文档已经有使用 upsert 的示例:

为冲突设置特定值

diesel::insert_into(users)
    .values(&user2)
    .on_conflict(id)
    .do_update()
    .set(name.eq("I DONT KNOW ANYMORE"))
    .execute(&conn);

设置AsChangeset结构冲突

diesel::insert_into(users)
    .values(&user2)
    .on_conflict(id)
    .do_update()
    .set(&user2)
    .execute(&conn);

用于excluded获取拒绝值

diesel::insert_into(users)
    .values(&vec![user2, user3])
    .on_conflict(id)
    .do_update()
    .set(name.eq(excluded(name)))
    .execute(&conn)

IncompleteDoUpdate::set采用任何实现的值AsChangeset,而&Vec<T>没有实现。因此,将其作为参数传递给 是无效的set

于 2017-12-04T03:29:56.363 回答
0

如果您需要指定如何在冲突时更新多个列,该set函数接受一个元组。

例如:

use diesel::pg::upsert::excluded;

let user = User { id: 1, name: "Pascal", age: 18 };
let user2 = User { id: 1, name: "Sean", age: 21 };
let user3 = User { id: 2, name: "Tess", age: 25 };

assert_eq!(Ok(1), diesel::insert_into(users).values(&user).execute(&conn));

let insert_count = diesel::insert_into(users)
    .values(&vec![user2, user3])
    .on_conflict(id)
    .do_update()
    .set((
        name.eq(excluded(name)),
        age.eq(excluded(age)),
    ))
    .execute(&conn);

请参阅:https ://docs.diesel.rs/diesel/fn.update.html#examples

于 2022-01-26T02:17:11.553 回答