我正在尝试使用QT QSqlRelationalTableModel
。我是MySQL表关系的新手,但我仍然尝试过,无法在QT中正常工作。
我可以从MySQL获得结果:
create table stu(idd int auto_increment primary key,stu_name varchar(60),stu_age int);
create table stuInfo(idd int auto_increment primary key,stu_city varchar(60),stu_sub varchar(100), foreign key(id) references stu(id));
select stu.stu_name,stuInfo.stu_city from stu inner join stuInfo on stu.id=stuInfo.id;
从MySQL检索数据:
select stu.stu_name,stuInfo.stu_city from stu inner join stuInfo on stu.id=stuInfo.id;
在QT中,我无法使其发挥作用。我对 setRelation()
和 QSqlRelation()
感到困惑。我并不完全理解我如何在QT中执行相同的查询,我以各种方式尝试它,但有时我得到空白数据,丑陋的标题,错误等。
这是我的学习代码:
model = new QSqlRelationalTableModel();
model->setTable("stu");
model->setRelation(0,QSqlRelation("stu","id","stu_name","stu_age"));
model->setRelation(0,QSqlRelation("stuInfo","id","stu_city","stu_sub"));
model->select();
ui->tableView->setModel(model);
答案 0 :(得分:1)
QSqlRelation
将字段的值替换为关系中其他字段的值,替换的字段将不再出现在查询中,因此您不能将2个关系分配给该字段列,您无法为主键指定关系(如the documentation of setRelation
中所述)。
基本上应该使用QSqlRelationalTableModel
的结构将是一个主表,它将具有一个或多个外部索引字段,并且这些字段中的每一个都可以替换为表中所选字段的值。外部索引来自哪个(例如:用主要表中的“city_id”数字字段替换来自另一个表中“city_id”为主键的城市名称)。
对于您要执行的操作,您应该将QSqlQueryModel
与手动构造的查询一起使用而不是QSqlRelationalTableModel
。
答案 1 :(得分:1)
问题是你的代码并没有真正表达你所描述的模型。
您有一个名为stuInfo的主表,它引用另一个名为stu的表。 要在Qt中执行此操作,您应该基于“stuInfo”创建一个表(而不是“stu”!):
model=new QSqlRelationalTableModel();
model->setTable("stuInfo");
然后你可以实现你的外键,作为关系:
model->setRelation(3,QSqlRelation("stu","id","stu_name"));
你需要在stuInfo表上指向索引“3”,这是参考字段“id”的位置(0将指向主键,这不是你想要的!)。 QsqlRelation的参数是引用表名(“stu”),主要字段名称(“id”)和要指向的引用表字段:在这种情况下,我指向“stu_name”;如果我想指出年龄,我可以做这样的事情:
model->setRelation(3,QSqlRelation("stu","id","stu_age"));
在此代码之后:
model->select();
ui->tableView->setModel(model);
你应该有一个视图,显示stuInfo上的所有字段,其最后一个字段(“id”)映射到“stu”表上的名称(或年龄);