我只用了id integer primar key auto_increment.
2. QT新建一个不带ui的项目,连接数据库
QSqlDatabase db;
db = QSqlDatabase::addDatabase("QMYSQL");//选择连接类型
db.setHostName("localhost");//设置设备名
db.setDatabaseName("Learn_References");//连接库名
db.setPort(3306);//设置端口 默认为3306
db.setUserName("root");//登录用户名
db.setPassword("1111");//用户名密码
if(!db.open())//打开失败返回错误窗口
QMessageBox::warning(this,"",db.lastError().text());
3. 创建一个student表,字段(id、name、age、address),并设置address为city表id的外键。
QSqlQuery query;
if(!query.exec("create table student("
"id integer primary key auto_increment,"
"name varchar(20),"
"age integer,"
"address integer,"
"foreign key(address) references city(id)"
")"))
QMessageBox::warning(this,"",query.lastError().text());
4. 插入数据
insert into student (name, age, address) values ('AAA', 20, 2);
insert into student (name, age, address) values ('BBB', 25, 1);
insert into student (name, age, address) values ('CCC', 22, 4);
insert into student (name, age, address) values ('DDD', 23, 5);
... ...
5. 使用QSqlTableModel显示数据
QSqlTableModel * model = new QSqlTableModel(this,db);
model->setTable("student");
model->select();
6. 可以发现,其中address栏是我们插入的数字,那么与city表中的cityname连接则需要使用QSqlRelationalTableModel。
QSqlRelationalTableModel * model = new QSqlRelationalTableModel(this);
model->setTable("student");
model->setRelation(3,QSqlRelation("city","id","cityname"));
解释下model->setRelation(3,QSqlRelation("city","id","cityname"));
3 是使用外键的列号
QSqlRelation原型:
QSqlRelation(const QString &aTableName, const QString &indexCol,const QString &displayCol)
所以可以理解为(关联_表名,关联外键_字段,替换_字段)
执行后是这样的
!!!注意!!!
如果你用的是mysql,那么直接可以使用。如果你用的是sqlite,需要执行query.exec("pragma foreign_keys = on");
开启外键功能。
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
//连接数据库
QSqlDatabase db;
db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("Learn_References");
db.setPort(3306);
db.setUserName("root");
db.setPassword("1111");
if(!db.open())
QMessageBox::warning(this,"",db.lastError().text());
// 创建student表
// QSqlQuery query;
// if(!query.exec("create table City("
// "id integer primary key auto_increment,"
// "name varchar(20),"
// "age integer,"
// "address integer),"
// "foreign key(address) references city(name)"
// ")"))
// QMessageBox::warning(this,"",query.lastError().text());
// if(!query.exec("insert into student (name,age,address) values('AAA',21,5)"))
// QMessageBox::warning(this,"",query.lastError().text());
//常规显示
// QSqlTableModel * model = new QSqlTableModel(this,db);
// model->setTable("student");
//QSqlRelationalTableModel显示
QSqlRelationalTableModel * model = new QSqlRelationalTableModel(this);
model->setTable("student");
model->setRelation(3,QSqlRelation("city","id","cityname"));
//显示
QTableView * view = new QTableView(this);
view->setModel(model);
model->select();
setCentralWidget(view);
}