For AI agents: the complete documentation index is available at https://a3s-lab.github.io/ORM/v0.2.0/llms.txt, the full documentation bundle is available at https://a3s-lab.github.io/ORM/v0.2.0/llms-full.txt, and this page is available as Markdown at https://a3s-lab.github.io/ORM/v0.2.0/queries/mutations.md.
  • 简体中文
  • v0.2.0
  • INSERT、UPDATE 与 DELETE

    写查询沿用列所有权和值族约束。没有赋值的 INSERT 或 UPDATE 会在编译阶段失败。

    单行与多行 INSERT

    use a3s_orm::{insert_into, InsertRow};
    
    let single = insert_into::<Person>()
        .value(Person::id(), 1)
        .value(Person::name(), "Ada")
        .value(Person::age(), 36)
        .returning((Person::id(), Person::name()));
    
    let rows = [
        InsertRow::<Person>::new()
            .value(Person::id(), 2)
            .value(Person::name(), "Grace")
            .value(Person::age(), 40),
        InsertRow::<Person>::new()
            .value(Person::id(), 3)
            .value(Person::name(), "Linus")
            .value(Person::age(), 28),
    ];
    
    let batch = insert_into::<Person>().rows(rows);

    多行编译会验证每一行具有相同的列与顺序,然后再把值加入共享参数序列。

    冲突处理

    let upsert = insert_into::<Person>()
        .value(Person::id(), 1)
        .value(Person::name(), "Ada")
        .value(Person::age(), 37)
        .on_conflict(Person::id())
        .do_update_from_excluded(Person::name())
        .do_update_from_excluded(Person::age())
        .returning(Person::id());

    冲突目标可以是一列或最多四列的元组。do_nothing、绑定值更新与 excluded 行引用都会保持结构化。MySQL 方言会拒绝这条语法。

    UPDATE

    use a3s_orm::update_table;
    
    let update = update_table::<Person>()
        .set(Person::name(), "Ada Lovelace")
        .filter(Person::id().eq(1))
        .returning((Person::id(), Person::name()));

    UPDATE 不会自动要求过滤条件。全表更新必须由调用方明确构建,建议在应用边界增加策略检查。

    v0.2.0 的更新边界

    这个版本支持绑定值 set 与 returning,但没有 set_expression、UPDATE CTE 或 UPDATE FROM。不要把较新版本的示例复制到 v0.2.0。

    DELETE

    use a3s_orm::delete_from;
    
    let removed = delete_from::<Person>()
        .filter(Person::id().eq(3))
        .returning(Person::id());

    DELETE 同样允许无过滤条件。生产接口应把全表删除作为单独的受控操作。