我正在使用Books Qt 示例,但我使用的是 PostgreSQL 而不是 SQLite,因此我的主表和相关表是使用以下代码创建的:
QSqlQuery q;
if (!q.exec(QLatin1String("create table orders(id serial primary key, name varchar, supplier integer, product integer, year integer, rating integer)")))
return q.lastError();
if (!q.exec(QLatin1String("create table suppliers(id serial primary key, name varchar, birthdate date)")))
return q.lastError();
if (!q.exec(QLatin1String("create table products(id serial primary key, name varchar)")))
return q.lastError();
现在,我想在数据库中添加一个新行。到目前为止,我有下一个代码:
QSqlRecord record;
QSqlField f0("id", QVariant::Int);
QSqlField f1("name", QVariant::String);
QSqlField f2("supplier", QVariant::Int);
QSqlField f3("product", QVariant::Int);
QSqlField f4("year", QVariant::Int);
QSqlField f5("rating", QVariant::Int);
// id is serial and I'd like not to set manually the value
f0.setValue(100);
f1.setValue(QVariant("Test1"));
f2.setValue(QVariant(3));
f3.setValue(QVariant(3));
f4.setValue(QVariant(2001));
f5.setValue(QVariant(5));
record.append(f0);
record.append(f1);
record.append(f2);
record.append(f3);
record.append(f4);
record.append(f5);
model->insertRecord(-1, record)
在这里我们遇到了问题。如您所见,id
是主键,其类型是serial
。如果我不设置值(即删除行record.append(f0);
),表在 PostgreSQL 中正确更新,但 QtTableView
在MainWindow
.
我试过了QSqlField::setAutoValue
,QSqlField::setGenerated
但行为是一样的。QAbstractItemModel::setData
将是另一种选择,但这也不是解决方案。
我可以插入记录,然后将第一个字段更新为id
存储在数据库中的字段,但我想知道这个问题是错误还是 API 是正确的,问题是我使用它的方式。