我正在尝试使用Diesel和PostgreSQL执行插入或更新。
我试过了:
diesel::insert_into($table::table).values(&objects).on_conflict($table::id).do_update().set(&objects).execute(conn).unwrap();
其中objects
是std::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()
或on_conflict_do_replace()
之类的内容。
答案 0 :(得分:6)
Diesel 1.3.3's documentation已经有使用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
是无效的。