qicosmos/ormpp

反序列化

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,文档没更新,晚点会更新

image
这个我昨天就试过了,打印的 size是0

因为里面本来就没数据啊,你先插入数据再查询就会发现有数据的哈。

这张表是有数据的
image

表和结构体没有对应上啊,表有6个字段吧,结构体就1个字段,这样反序列化都会失败了。

。。。大哥您是说,要把一张表所有的字段都要和结构体对的上?

对,要一一映射。

真是不好意思,怪我唐突了。我没想到是这种情况,我以为反序列化就是定义好想要的就行

你可以查询部分字段,用tuple也是可以的,

那我还是用tuple吧

你可以只查询id,用tuple是没问题的,如果要按对象查询就需要字段都对应上,

不过这种反序列化的用法感觉对生产环境太不友好了。一般一张表的字段都有十几种,但是想拿的可能只有一两个

我晚点确认一下,看看不用tuple是不是也可以。

好的