我正在使用Books Qt示例,但我没有使用SQLite,而是使用PostgreSQL,所以我的主表和相关表是使用以下代码创建的:
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中正确更新,但Qt在TableView
中显示MainWindow
中的空白行。
我尝试使用QSqlField::setAutoValue
和QSqlField::setGenerated
,但行为是一样的。 QAbstractItemModel::setData
将是另一种选择,但它也不是解决方案。
我可以插入记录,然后将第一个字段更新为存储在数据库中的id
,但我想知道这个问题是否是错误或API是否正确,问题是这样的我正在使用它。