使用Diesel执行插入或更新

时间:2017-12-04 03:21:07

标签: postgresql rust rust-diesel

我正在尝试使用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()on_conflict_do_replace()之类的内容。

1 个答案:

答案 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是无效的。

相关问题