qicosmos/ormpp

REFLECTION_WITH_NAME after REGISTER_AUTO_KEY, the get_insert_id_after_insert can't get correct result.

Closed this issue · 5 comments

struct student {
  std::string name;
  int age;
  int id;
};
REGISTER_AUTO_KEY(student, id)
REFLECTION_WITH_NAME(student, "t_student", id, name, age)

int main() {
#ifdef ORMPP_ENABLE_MYSQL
  {
    dbng<mysql> mysql;
    if (mysql.connect(ip, username, password, db, 5, port)) {
      mysql.create_datatable<person>(ormpp_auto_key{"id"});
      mysql.delete_records<person>();
      mysql.insert<person>({"purecpp"});
      mysql.insert<person>({"purecpp", 6});

      mysql.create_datatable<student>();

      student stu;
      stu.name = "xyz";
      stu.age = 18;

      // the result id is not right!!!
      auto id = mysql.get_insert_id_after_insert(stu);
      std::cout << id << std::endl;
    }
    else {
      std::cout << "connect fail" << std::endl;
    }
  }
}
  1. 在mysql下使用REGISTER_AUTO_KEY注册自增id主键
  2. 再使用REFLECTION_WITH_NAME做字段映射与数据库表关联
  3. 调用get_insert_id_after_insert接口插入不带id字段的student数据时,不能正确返回插入的自增id。

原因:REGISTER_AUTO_KEY内部映射时候的是结构体名student,而未不是t_student,但get_insert_id_after_insert接口内获取到名字是t_student

请将mysql.create_datatable();改成mysql.create_datatable(ormpp_auto_key{"id"});

使用REGISTER_AUTO_KEY(t_student, id)能够获取正确的结果,或许可以在get_insert_id_after_insert接口或README中添加特别说明!

好的

hello @jacking !
还有个疑问:这个接口在进行批量插入时,get_insert_id_after_insert为什么不返回所有的插入后的id呢,而是返回最后一个插入的id,虽然用户端可以根据插入的数量,反向获取这些id(即通过last id--来匹配所有的插入的id)

你可以根据数量倒着推呢!