使用Diesel执行插入或更新

Ron*_*nny 3 postgresql rust rust-diesel

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

我试过了:

diesel::insert_into($table::table).values(&objects).on_conflict($table::id).do_update().set(&objects).execute(conn).unwrap();
Run Code Online (Sandbox Code Playgroud)

其中objects是a std::vec::Vec<Struct>- 导致编译器错误:

^^^ the trait 'diesel::query_builder::AsChangeset' is not implemented for '&std::vec::Vec<Struct>'
Run Code Online (Sandbox Code Playgroud)

有一个on_conflict_do_nothing()查询生成器,但我似乎无法找到类似on_conflict_do_update()on_conflict_do_replace().

She*_*ter 11

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);
Run Code Online (Sandbox Code Playgroud)

AsChangeset在冲突上设置struct

diesel::insert_into(users)
    .values(&user2)
    .on_conflict(id)
    .do_update()
    .set(&user2)
    .execute(&conn);
Run Code Online (Sandbox Code Playgroud)

使用excluded来获取拒绝值

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

IncompleteDoUpdate::set需要实现任意值AsChangeset,这&Vec<T>不.因此将它作为参数传递给它是无效的set.