我正在try 使用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()这样的东西.

推荐答案

Diesel 1.3.3's documentation已经有了使用upsert的示例:

Set specific value on conflict

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

Set 100 struct on conflict

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

Use 100 to get the rejected value

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是无效的.

Rust相关问答推荐

如何在Rust中获得高效的浮点最大值

为什么对不可复制数据的引用的取消引用没有O权限来避免Rust中的双重释放?

铁 rust 干线无法使用PowerShell获取环境变量

MutexGuard中的过滤载体不需要克隆

通过不同的字段进行散列和排序的 struct (需要不同的EQ实现)

无法从流中读取Redis请求

如果包名称与bin名称相同,并且main.ars位于工作区的同一 crate 中,则无法添加对lib.ars的依赖

什么是`&;[][..]`铁 rust 里的刻薄?

如何获取光标下的像素 colored颜色 ?

如何强制匹配的返回类型为()?

如何以与平台无关的方式将OsString转换为utf-8编码的字符串?

可选包装枚举的反序列化

Rust与_有何区别?

全面的 Rust Ch.16.2 - 使用捕获和 const 表达式的 struct 模式匹配

如何在 Rust 中显式声明 std::str::Matches<'a, P> ?

从Rust 的临时文件中创建引用是什么意思?

如何解析 Rust 中的 yaml 条件字段?

Rustfmt 是否有明确类型的选项?

Iterator::collect如何进行转换?

Rust 生命周期:不能在方法内重新borrow 可变字段