REFLECTION_WITH_NAME after REGISTER_AUTO_KEY, the get_insert_id_after_insert can't get correct result.
Closed this issue · 5 comments
lemon19900815 commented
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;
}
}
}
- 在mysql下使用
REGISTER_AUTO_KEY
注册自增id主键 - 再使用
REFLECTION_WITH_NAME
做字段映射与数据库表关联 - 调用
get_insert_id_after_insert
接口插入不带id字段的student数据时,不能正确返回插入的自增id。
原因:REGISTER_AUTO_KEY
内部映射时候的是结构体名student
,而未不是t_student
,但get_insert_id_after_insert
接口内获取到名字是t_student
。
Jacyking commented
请将mysql.create_datatable();改成mysql.create_datatable(ormpp_auto_key{"id"});
lemon19900815 commented
使用REGISTER_AUTO_KEY(t_student, id)能够获取正确的结果,或许可以在get_insert_id_after_insert接口或README中添加特别说明!
Jacyking commented
好的
lemon19900815 commented
hello @jacking !
还有个疑问:这个接口在进行批量插入时,get_insert_id_after_insert为什么不返回所有的插入后的id呢,而是返回最后一个插入的id,虽然用户端可以根据插入的数量,反向获取这些id(即通过last id--
来匹配所有的插入的id)
Jacyking commented
你可以根据数量倒着推呢!