反序列化
Closed this issue · 23 comments
environment
docker version: gcc:11.3.0
连接的数据库是阿里云上的
我在使用单表查询的功能时,发现通过反序列化实现的查询功能并不能从数据库中拿到数据。而使用多表查询的方法(tuple)却可以。使用反序列化查询时,TEST_CHECK也会直接报错。请问我该从哪个方面定位问题?
可以先在本地测试看看,如果有问题可以把测试代码发出来看看。
本地mysql是docker版的,请问这个有影响么
应该测试代码的问题,看一下例子,然后在单机上测试一下先。
我再本地装的mysql,程序访问不了。一直报 accept denied。mysql版本是mysql Ver 14.14 Distrib 5.6.51
因为我的docker没有映射127.0.0.1,所以我访问本地数据库是用的本机的内网/外网地址
建议你先在本地把mysql环境搞好,方便测试,网上有很多教程可以参考。
嗯好的。我决定先保证项目顺利推进,所以现在打算先换成sql原生语句。等业余时间再处理这种问题。非常感谢您的指导
这个issue请先别关
把测试代码发出来看看。
连接阿里云无返回值:
struct user
{
int id;
};
REFLECTION(user, id)
void testormpp()
{
ormpp::dbng<ormpp::mysql> mysql;
mysql.connect("......aliyuncs.com", "user", "passwerword", "db");
// auto res = mysql.query<aicall_tts_file_cache>("id = 5622");
auto res = mysql.query<user>("where id=1");
std::cout<<res.size();
auto res1 = mysql.query<std::tuple<int>>("select id from user where id = 1");//原生语句可以返回
std::cout<<res.size();
std::cout<<std::get<0>(res1[0]);
for(auto& file : res){
std::cout<<file.id<<" ";
}
}
连接不上本地数据库:
struct person
{
int id;
std::string name;
int age;
};
REFLECTION(person, id, name, age)
void wdtestormpp()
{
person p = {1, "test1", 2};
person p1 = {2, "test2", 3};
person p2 = {3, "test3", 4};
std::vector<person> v{p1, p2};
dbng<mysql> mysql;
mysql.connect("172.17.214.xxx", "root", "123456", "test_db");
// mysql.connect("0.0.0.0", "root", "123456", "test_db");
mysql.create_datatable<person>();
mysql.insert(p);
mysql.insert(v);
mysql.update(p);
mysql.update(v);
auto result = mysql.query<person>(); //vector<person>
for(auto& person : result){
std::cout<<person.id<<" "<<person.name<<" "<<person.age<<std::endl;
}
mysql.delete_records<person>();
//transaction
mysql.begin();
for (int i = 0; i < 10; ++i) {
person s = {i, "tom", 19};
if(!mysql.insert(s)){
mysql.rollback();
std::cout<<"-1"<<std::endl;
}
}
mysql.commit();
}
query<aicall_tts_file_cache>("id = 5622"),这种,("where id = 5622 ")我也试过
把这句
auto res = mysql.query<user>("where id=1");
改成
auto res = mysql.query<user>("id=1");
不用加where,文档没更新,晚点会更新
因为里面本来就没数据啊,你先插入数据再查询就会发现有数据的哈。
表和结构体没有对应上啊,表有6个字段吧,结构体就1个字段,这样反序列化都会失败了。
。。。大哥您是说,要把一张表所有的字段都要和结构体对的上?
对,要一一映射。
真是不好意思,怪我唐突了。我没想到是这种情况,我以为反序列化就是定义好想要的就行
你可以查询部分字段,用tuple也是可以的,
那我还是用tuple吧
你可以只查询id,用tuple是没问题的,如果要按对象查询就需要字段都对应上,
不过这种反序列化的用法感觉对生产环境太不友好了。一般一张表的字段都有十几种,但是想拿的可能只有一两个
我晚点确认一下,看看不用tuple是不是也可以。
好的